2

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

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

由于此问题之外的原因,此处不能选择更改命名空间和/或类名。

4

1 回答 1

0

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

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

如果您无法修改任何内容以使这些条件中的任何一个为假,那么您正在处理一些非常严重的限制。

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

于 2015-06-03T02:31:08.713 回答