为什么将x:Name属性添加到用户控件会导致编译错误?

时间:2010-07-28 10:13:20

标签: wpf xaml user-controls prism

我真的需要更多关于造成这种情况的想法,目前它正在推动我的发展。

我有一个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名称),但我不认为这是特别不寻常的。

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

<views:MyHeaderView x:Name="header"/>

我得到的错误很简单:

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

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

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

5 个答案:

答案 0 :(得分:6)

我想我找到了答案。

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

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

答案 1 :(得分:3)

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

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被中断为类型,而不是命名空间。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您是否拥有名为“View”的类,与命名空间相同?

答案 4 :(得分:0)

WPF不喜欢你使用x:在程序集中定义的控件的名称,假设xmlns:views =“clr-namespace:MyModule.View”与你的程序集相同

改用姓名,你会没事的