我想我找到了答案。
如果我将模块类重命名为 MyModuleThingy,则它可以编译。似乎出现问题是因为模块类与包含它的命名空间具有相同的名称(MyModule.MyModule)。
如果有人能让我知道为什么这可能是一个问题,我很想知道。特别是因为我继承了很多代码,这似乎是 Prism 的特定实现中的常见模式。
问题是您有一个同名的类和命名空间。如果你有类似的东西:
namespace MyModule {
public class MyModule {
}
public class MyView {
}
public class MyControl {
public void Foo() {
MyModule.MyView v = ..;
}
}
}
v之前的类型会认为MyView是在MyModule类型中作为嵌套类型。它不会将 MyModule 解析为命名空间,因为该类型基于 C# 的类型解析规则而获胜。
背后生成的代码只是采用您在 xmlns 中定义的命名空间,并在创建支持字段时将其添加到前面(由于 x:Name 属性)。所以你最终得到
MyModule.View.MyHeaderView
,其中 MyModule
被解释为类型,而不是命名空间。
我很不幸地把我的项目称为 TextEditor,显然这个名称与现有的 MS 类冲突。我尝试将 x.Name 或 Name 属性添加到对用户控件的引用时出现编译错误,抱怨编译器找不到我的用户控件。 显然它正在研究 MS 课程,而不是本地项目。 我将项目重命名为 TextEditorProject,必须使用 Grep 来查找所有出现的情况,但最终,我让它工作了。
你是否有一个名为“View”的类,与命名空间相同?
WPF 不喜欢您使用 x:Name 作为程序集中定义的控件,假设 xmlns:views="clr-namespace:MyModule.View" 与您的程序集相同
用名字代替,就可以了