在XAML中,可以使用xmlns
指令导入自定义命名空间:
xmlns:custom="clr-namespace:GreatStuff"
在c#中,这个命名空间可以用
导入using GreatStuff;
此外,基于全局(根)命名空间的命名空间的计算可以按如下方式执行:
using global::GreatStuff;
如何在XAML中执行基于全局命名空间的评估?
背景:
我正面临这样一种情况(诚然有点模糊),即存在这样一个命名空间global::GreatStuff
,其中包含一个名为…的WPF控制类。GreatStuff
(即完全合格,即c#中的global::GreatStuff.GreatStuff
)。在相同的命名空间中,我想在WPF窗口中使用该控件。
有趣的是,在这个星座中,我不能在窗口的XAML文件中对global::GreatStuff.GreatStuff
类型的任何控件使用Name
/x:Name
属性:
类型"GreatStuff.GreatStuff"中不存在类型名称"GreatStuff"。(CS0426)
注意,如果我不指定Name
/x:Name
属性,同样的文件编译得很好!
现在,为什么编译器假设通过设置Name
/x:Name
属性,我试图访问称为GreatStuff.GreatStuff.GreatStuff
的东西?
可以通过检查从窗口XAML文件生成的.g.cs
文件找到答案。在该文件中,XAML代码段
<custom:GreatStuff x:Name="stuff"/>
被编译成以下c#代码片段:
internal GreatStuff.GreatStuff stuff;
也就是说,使用全限定名称,但没有显式的全局命名空间标记。
当然,作为名称空间global::GreatStuff
中类中的字段,所有这些都被包装在
namespace GreatStuff {
因此,可怜的c#编译器不得不假设stuff
应该是global::GreatStuff.GreatStuff.GreatStuff
类型。如果在
xmlns:custom="clr-namespace:GreatStuff"
我可以强制在强制全局命名空间时,任何提到该命名空间前缀的地方都可以被转换。
由于这个问题的外部原因,这里不能更改名称空间和/或类名。
此问题仅在以下所有条件均为true时发生:
- 你有一个类的名字与包含它的命名空间相同。
- 在同一个命名空间中,你有一个xaml文件,其中包含一个对象的实例,该对象也在该命名空间中声明。
- 特定对象实例被赋予Name或x:Name属性。
如果你不能修改任何东西使这些条件中的任何一个为假,那么你正在处理一些非常严重的限制。
据我所知,这是xaml编译器的一个限制,您需要联系微软解决这个问题。我能想到的唯一一件事是尝试使用自定义构建过程来解决这个问题,该过程构建xaml,允许您编辑生成的文件,然后构建代码。这需要一些研究来弄清楚如何设置。