在XAML中强制使用全局命名空间

时间:2015-06-02 21:46:40

标签: c# wpf xaml namespaces global-namespace

在XAML中,可以使用xmlns指令导入自定义命名空间:

xmlns:custom="clr-namespace:GreatStuff"

在C#中,可以使用

导入该命名空间
using GreatStuff;

此外,可以按如下方式对基于全局(根)命名空间的命名空间进行评估:

using global::GreatStuff;

如何根据XAML中的全局命名空间强制执行评估?

背景

我正面临着(明显有点模糊)的情况,即存在这样一个名称空间global::GreatStuff,其中包含一个名为... GreatStuff的WPF控件类(即完全合格的,即' s C#中的global::GreatStuff.GreatStuff。在同一名称空间中,我想在WPF窗口中使用该控件。

有趣的是,在这个星座中,我不能在窗口的XAML文件中对Name类型的任何控件使用x:Name / global::GreatStuff.GreatStuff属性:

  

类型名称' 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"

我可以强制执行该命名空间前缀的任何提及都可以在强制执行全局命名空间时进行转换。

由于此问题以外的原因,此处无法更改命名空间和/或类名称。

1 个答案:

答案 0 :(得分:0)

只有在满足以下所有条件时才会出现此问题:

  1. 您的类名称与包含它的名称空间相同。
  2. 在同一个命名空间中,您有一个xaml文件,其中包含一个也在该命名空间中声明的对象实例。
  3. 该特定对象实例被赋予Name或x:Name属性。
  4. 如果您无法修改任何内容以使其中任何一个条件错误,那么您正在处理一些非常严格的限制。

    据我所知,这是xaml编译器的限制,您需要联系Microsoft以解决它。我能想到的唯一另一件事就是尝试使用构建xaml的自定义构建过程来解决它,允许您编辑生成的文件,然后构建代码。这需要一些研究来确定如何设置。