38

XAML文件(WPF UserControl)中,有没有办法引用另一个类“A”中定义的内部类“B”?

public class A
{
    public class B
    {
    }
}

就像是 :

<local:A.B ... />

此语法不起作用,因为“B”被解释为“A”类中名为“B”的属性。

我尝试了更多奇特的语法,例如“::”或“+”,但似乎都没有。

我目前正在使用Silverlight 4VS2010

在此先感谢您的帮助。

4

3 回答 3

54

这个问题很老了,我不知道它是否适用于 2010 年的 WPF 版本,但现在您可以使用嵌套类型的“真实”(内部)名称使其工作:

<local:A+B />

如果您曾经看过反汇编代码,那么嵌套类型就是这样的:

ParentTypeName+Nested
于 2012-11-14T00:09:25.423 回答
32

我一直在寻找和寻找,因为如果这是可能的,我想知道。不幸的是,我在msdn上找到了这个:

您的自定义类不能是嵌套类。嵌套类及其常规 CLR 使用语法中的“点”会干扰其他 WPF 和/或 XAML 功能,例如附加属性。

因此,您似乎无法使用点运算符引用嵌套类。至于通过 XAML 访问该内部类的替代方法,我的搜索还没有任何运气。:o(但这是一个相当有趣的问题,所以我会继续寻找。也许我会找到一些运气!:o)

于 2010-11-24T18:44:08.783 回答
15

.财产;不知道为什么 XAML 也不能搜索嵌套类,但事实并非如此。


嵌套类可以字符串(例如属性值)中表示,使用A+B代替A.B

<Label SomeProperty1="{x:Static local:A+B.SomeProperty2}" />

作为元素名称(如问题所示),+是不允许的,因为结果将不再是有效的 XML;+不是有效的名称字符:
XAML 是 XML
XML 规范 - NameChar

所以元素名称不能直接描述嵌套类。
但请参阅下面的更新 - 解决此问题的替代语法。


更新
根据@Artfunkel对一个答案的评论,这应该是一个解决方案[我没有测试过]:

<x:Type TypeName="local:A+B"/>

来自:https ://docs.microsoft.com/en-us/dotnet/framework/xaml-services/x-type-markup-extension

待定如何使用该语法指定属性。使用x:TypeArguments

于 2018-06-24T02:43:32.507 回答