在 XAML 中,可以使用xmlns
指令导入自定义命名空间:
xmlns:custom="clr-namespace:GreatStuff"
在 C# 中,可以使用
using GreatStuff;
此外,基于全局(根)命名空间对该命名空间的评估可以强制执行如下:
using global::GreatStuff;
如何根据 XAML 中的全局命名空间强制执行评估?
背景:
我面临着(诚然有点晦涩)的情况,即存在这样一个 namespace global::GreatStuff
,其中包含一个名为 ... 的 WPF 控件类GreatStuff
(即完全限定,global::GreatStuff.GreatStuff
在 C# 中)。在同一个命名空间中,我想在 WPF 窗口中使用该控件。
有趣的是,在这个星座中,我不能在窗口的 XAML 文件中的任何类型控件上使用Name
/属性:x:Name
global::GreatStuff.GreatStuff
“GreatStuff.GreatStuff”类型中不存在类型名称“GreatStuff”。(CS0426)
请注意,如果我不指定Name
/x:Name
属性,则相同的文件编译得很好!
现在,为什么编译器应该假设通过设置Name
/x:Name
属性,我正在尝试访问名为 的东西GreatStuff.GreatStuff.GreatStuff
?
可以通过检查.g.cs
从窗口 XAML 文件生成的文件来找到答案。在该文件中,XAML 片段
<custom:GreatStuff x:Name="stuff"/>
被编译为以下 C# 片段:
internal GreatStuff.GreatStuff stuff;
也就是说,使用完全限定的名称,但没有显式的全局名称空间标记。
当然,作为 namespace 类中的一个字段global::GreatStuff
,所有这些都被包裹在
namespace GreatStuff {
因此,可怜的 C# 编译器不禁假设它stuff
应该是 type global::GreatStuff.GreatStuff.GreatStuff
。如果在
xmlns:custom="clr-namespace:GreatStuff"
我可以强制在强制全局命名空间时可以转换任何提及该命名空间前缀的内容。
由于此问题之外的原因,此处不能选择更改命名空间和/或类名。