【问题标题】:Type reference cannot find public type named类型引用找不到名为的公共类型
【发布时间】:2012-05-04 05:27:55
【问题描述】:

我在 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>

【问题讨论】:

  • 你记得像这样在顶部添加本地命名空间吗? xmlns:local="clr-namespace:MyNamespace"

标签: c# wpf xaml


【解决方案1】:

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

xmlns:local="clr-namespace:NamespaceContainingSignClass"

不要

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

【讨论】:

  • 这对我有用。您能否解释为什么无法找到类型引用?
  • @DennisKassel 我不知道为什么会这样。如果我推测,我会说如果省略了程序集,它会搜索包含 XAML 的程序集,如果指定了程序集,它会在引用的程序集中查找指定的程序集并搜索它。由于当前程序集不在引用的程序集中,因此无法找到它。在当前的实现中有些奇怪的东西。
  • 感谢您的评论。几天前,我还从一本书中得到确认,当命名空间位于同一个程序集中时,您必须省略程序集名称。
  • VS 自动生成 xmlns:local 作为带有程序集的那个。我们应该把它命名为别的吗?他们有这方面的记录吗?
【解决方案2】:

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

【讨论】:

  • 我已经澄清了我的答案。如果类与 XAML 位于同一程序集中,则仅省略程序集名称。
  • 我自己也遇到过这个问题,添加程序集名称也解决了这个问题。我的在与类相同的程序集中的 ResourceDictionary xaml 文件中,但仍需要添加程序集名称。
  • 谢谢!我还使用了 ResourceDictionary 并希望动态加载它。我刚刚添加了“;assembly=...”并将构建过程更改为“None”而不是“Page”,它工作正常。出于某种原因,我不得不更改构建过程才能编译程序。否则它会抛出奇怪的错误。
【解决方案3】:
  1. 检查 xaml 文件的根标记是否具有类Sign 映射到local 的命名空间别名:xmlns:local="clr-namespace:NamespaceContainingSignClass"
  2. 检查类Sign是否标记为public
  3. 检查类Sign是否有无参构造函数

【讨论】:

  • 哇!无参数构造函数!谢谢你。我想知道为什么会有这么奇怪的要求,你是怎么知道的?
  • 此要求基于您无法在 XAML 中指定构造函数参数这一事实。当您在 XAML 中键入 时,实际上您的意思是创建 Button 类实例,因此将调用构造函数。 XAML 是编写标记的声明性替代方案,并且在 XAML 中没有设计为构造函数参数这样的东西,因为没有必要这样做:您在标记中指定属性。
【解决方案4】:
  1. 检查并检查此问题的所有答案 - 我确信其中一个是正确的,但我不知道哪一个对我有用。
  2. 保存项目,关闭 Visual Studio,重新打开 Visual Studio。
  3. 瞧,它现在神奇地起作用了,尽管没有改变任何东西。
  4. 小声向微软宣誓,继续你的生活......

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      FancyTrainsimTools.Desktop
      

      是一个有效的项目名称。如果你在项目中使用文件夹,你可能会得到这样的结构:

      FancyTrainsimTools.Desktop.Logic
      

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

      解决方法:

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

      FancyTrainsimToolsDesktop
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-31
        • 2020-03-18
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多