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

问题描述 投票:0回答:5
wpf xaml user-controls prism
5个回答
7
投票

我想我找到了答案。

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

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


4
投票

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

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


1
投票

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


0
投票

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


0
投票

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

用名字代替,就可以了

© www.soinside.com 2019 - 2024. All rights reserved.