在XAML中强制全局命名空间

本文关键字:全局 命名空间 XAML | 更新日期: 2023-09-27 17:52:42

在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"

我可以强制在强制全局命名空间时,任何提到该命名空间前缀的地方都可以被转换。

由于这个问题的外部原因,这里不能更改名称空间和/或类名。

在XAML中强制全局命名空间

此问题仅在以下所有条件均为true时发生:

  1. 你有一个类的名字与包含它的命名空间相同。
  2. 在同一个命名空间中,你有一个xaml文件,其中包含一个对象的实例,该对象也在该命名空间中声明。
  3. 特定对象实例被赋予Name或x:Name属性。

如果你不能修改任何东西使这些条件中的任何一个为假,那么你正在处理一些非常严重的限制。

据我所知,这是xaml编译器的一个限制,您需要联系微软解决这个问题。我能想到的唯一一件事是尝试使用自定义构建过程来解决这个问题,该过程构建xaml,允许您编辑生成的文件,然后构建代码。这需要一些研究来弄清楚如何设置。