【问题标题】:Why would adding an x:Name attribute to a user control cause a compilation error?为什么将 x:Name 属性添加到用户控件会导致编译错误?
【发布时间】:2010-07-28 10:13:19
【问题描述】:

我真的需要更多关于造成这种情况的想法,目前它正在逼我上墙。

我有一个 Xaml 用户控件,其中包含另一个像这样的用户控件:


<UserControl x:Class="MyModule.View.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:igDock="http://infragistics.com/DockManager"
    xmlns:views="clr-namespace:MyModule.View"
    >
  <StackPanel x:Name="panel">
    <views:MyHeaderView/>
    <igDock:XamDockManager x:Name="dockingManager"/>
  </StackPanel>
</UserControl>

这是在一个 Prism 模块中(因此是 MyModule 名称),但除此之外,我不认为这有什么特别不寻常的地方。

现在,只要我在标题视图中添加名称,代码就无法编译,例如

&lt;views:MyHeaderView x:Name="header"/&gt;

我得到的错误很简单:

"The type name 'View' does not exist in the type MyModule.MyModule'"

我尝试将包含的用户控件移动到另一个命名空间,创建一个空白用户控件并尝试使用该控件(结果相同)并删除 XamDockManager,但似乎没有任何区别。

任何人都可以对此有所了解吗?

【问题讨论】:

    标签: wpf xaml user-controls prism


    【解决方案1】:

    我想我找到了答案。

    如果我将模块类重命名为 MyModuleThingy,那么它会编译。似乎问题出现了,因为模块类与包含它的命名空间具有相同的名称(MyModule.MyModule)。

    如果有人可以让我知道为什么这可能是一个问题,我很想知道。特别是因为我继承了很多代码,这似乎是 Prism 特定实现中的常见模式。

    【讨论】:

    • 这是我使用 Prism 的确切问题。非常感谢!
    【解决方案2】:

    问题是你有一个同名的类和命名空间。如果你有类似的东西:

    namespace MyModule {
        public class MyModule {
        }
        public class MyView {
        }
        public class MyControl {
            public void Foo() {
                MyModule.MyView v = ..;
            }
        }
    }
    

    v 之前的类型会认为 MyView 在 MyModule 类型中是嵌套类型。它不会将 MyModule 解析为命名空间,因为该类型基于 C# 的 resolution rules 类型获胜。

    后面生成的代码只是简单地使用您在 xmlns 中定义的命名空间,并在创建支持字段时将其添加到前面(由于 x:Name 属性)。所以你最终会得到MyModule.View.MyHeaderView,其中 MyModle 作为类型被中断,而不是命名空间。

    【讨论】:

      【解决方案3】:

      我很不幸地调用了我的项目 TextEditor,显然这个名称与现有的 MS 类冲突。我尝试将 x.Name 或 Name 属性添加到对我的用户控件的引用给我编译错误,抱怨编译器找不到我的用户控件。 显然它正在研究 MS 课程,而不是本地项目。 我将项目重命名为 TextEditorProject,不得不使用 Grep 来查找所有出现的情况,但最终,我得到了它的工作。

      【讨论】:

        【解决方案4】:

        可能是你有一个名为“View”的类,与命名空间相同吗?

        【讨论】:

        • 不,没有名为 View 的课程,至少我的课程没有。
        【解决方案5】:

        WPF 不喜欢您将 x:Name 用于程序集中定义的控件,假设 xmlns:views="clr-namespace:MyModule.View" 与您的程序集相同

        改用名字就好了

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-27
          • 1970-01-01
          • 2011-06-09
          • 1970-01-01
          • 2014-03-27
          • 1970-01-01
          • 2018-07-30
          • 1970-01-01
          相关资源
          最近更新 更多