类型引用找不到名为的公共类型

问题描述 投票:0回答:9

我在 xaml 中收到类似“类型引用无法找到名为“Sign”的公共类型”的错误。我该如何解决它。 Sign 类位于同一个程序集中。

<DataTemplate DataType="{x:Type local:Sign}">
    <Expander Padding="4"
              IsExpanded="{Binding RelativeSource={
                    RelativeSource Mode=FindAncestor, AncestorType={
                       x:Type ListBoxItem}}, Path=IsSelected}">
        <Expander.Header>
            <TextBlock Text="{Binding Name}" ... />
        </Expander.Header>
        <DockPanel LastChildFill="True">
            <Border DockPanel.Dock="Left" CornerRadius="16" BorderBrush="WhiteSmoke" Background="AliceBlue" BorderThickness="5" HorizontalAlignment="Center" VerticalAlignment="Center">
                <Image Source="{Binding Icon}" Width="90" Height="90" Stretch="Fill" />
            </Border>
            ...
        </DockPanel>                
    </Expander>

c# wpf xaml
9个回答
73
投票

如果类型与您正在修改的 XAML 驻留在同一程序集中,请在导入命名空间时省略 clr 命名空间的程序集段。

xmlns:local="clr-namespace:NamespaceContainingSignClass"

不要

xmlns:local="clr-namespace:NamespaceContainingSignClass;assembly=AssemblyContainingSignClassAndXAML"

14
投票

对于那些在我的船上没有得到谷歌上这个错误的前 1,00 个结果帮助的人......就我而言,这与 smelch 的建议完全相反:我必须在我的 xmlns 声明结束。我猜可能是因为我的特殊情况 - 我的数据模板位于独立的资源字典 xaml 文件中。没有把握。我只知道它不起作用直到我添加了程序集信息,所以对于那些在那里挣扎的人来说,请重击一下,看看它是否有效。我不想深入探讨为什么,它就是这样。


9
投票
  1. 检查xaml文件的根标签是否具有将类
    Sign
    映射到
    local
    别名的命名空间:
    xmlns:local="clr-namespace:NamespaceContainingSignClass"
  2. 检查班级
    Sign
    是否被标记
    public
  3. 检查类
    Sign
    是否有无参构造函数

4
投票
  1. 仔细检查这个问题的所有答案 - 我确信其中一个是正确的,但我不知道哪一个对我有用。
  2. 保存项目,关闭 Visual Studio,然后重新打开 Visual Studio。
  3. 瞧,它现在神奇地工作了,尽管没有改变任何东西。
  4. 低声咒骂微软,然后继续你的生活......

1
投票

现在遇到这个错误。问题是我从程序集中引用的类位于具有更高框架级别的程序集中(4.7.2 与 4.6)。版本对齐解决了问题。


1
投票

另一件事要检查,因为我今天刚刚解决了同样的问题...出于某种原因,我们有一个 xaml 文件,它添加了 Resource 而不是 Page 的构建操作。在该文件中,并且仅在该文件中,我们必须在命名空间声明中使用 assembly= 才能使其正常工作。自从 13 年前添加该文件以来,情况一直如此,其中的所有内容似乎都运行良好,直到现在我们才发现任何问题。

令我们困惑的是,我们正在创建 .NET 6 版本的 DLL,而新项目具有所有相同的代码和 xaml 文件,但不是该项目的 .NET Framework 版本的直接克隆。按照其设置方式,相关 XAML 文件的编译方式与所有其他文件相同,这意味着它不能在命名空间中包含 assembly= 部分。因此,有一段时间,我被误导,认为这可能是 .NET 6 与 .NET Framework 项目的差异。幸运的是,我注意到 XAML 文件在旧版本的项目中被设置为 Resource,一旦我修复了这个问题,在项目的两个版本中一切都工作正常(已删除 assembly=)。


0
投票

我刚刚发现了另一个问题,可能会导致此问题。 允许在项目名称中使用点,例如

FancyTrainsimTools.Desktop

是有效的项目名称。如果您在项目中使用文件夹,您可能会得到如下结构:

FancyTrainsimTools.Desktop.Logic

如果您定义引用此文件夹中的项目的数据模板,则会导致错误消息。我还使用了分层数据模板,但这给出了略有不同的消息。

解决方法:

通过删除点来重命名您的项目:

FancyTrainsimToolsDesktop

编辑:我尝试再次重现该问题,以便报告错误,但现在一切正常......所以谜团尚未解决,并且不清楚如何创建解决方案......


0
投票

对于 .Net 框架

检查另一个类,以防丢失的类即使在那里也无法解决,并且它在 NuGet 中,问题可以在参考 HintPaths 中。在文本编辑器中打开

.csproj
文件,查看包引用是否与 HintPath 匹配。

例如:

<Reference Include="System.IO.Pipelines, Version=7.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
 <HintPath>..\packages\System.IO.Pipelines.7.0.0\lib\net462\System.IO.Pipelines.dll</HintPath>
</Reference>

HintPath
需要更新以引用版本
7.1.0
的文件夹,就像参考一样。

有时 Visual Studio 不会更新

HintPath
,这会带来麻烦。


0
投票

我已经通过以下方式解决了这个问题:

  • 将类移至 xaml 后面的代码中
  • 继承wpf类即可识别(如:IValueConverter)
© www.soinside.com 2019 - 2024. All rights reserved.