在XAML中创建嵌套类的实例

Pra*_*eek 35 wpf xaml nested-class inner-classes

在一个XAML文件(WPF用户控件),有引用一个的方式内部类 "B"在另一个类中的"A"定义的?

public class A
{
    public class B
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

就像是 :

<local:A.B ... />
Run Code Online (Sandbox Code Playgroud)

此语法不起作用,因为"B"被解释为一个名为"B"类"A"的属性.

我尝试了更多异国情调的语法,如"::"或"+",但似乎都没有.

我目前正在使用带有VS2010的Silverlight 4.

在此先感谢您的帮助.

Lud*_*ant 42

这个问题是很老了,我不知道它是否会与WPF的版本在2010年回到了工作,但现在你可以把它用"真实"(内部)嵌套式的名称工作:

<local:A+B />
Run Code Online (Sandbox Code Playgroud)

如果你曾经看过一个反汇编的代码,那就是嵌套类型的样子:

ParentTypeName+Nested
Run Code Online (Sandbox Code Playgroud)

  • 这个技巧只适用于`{x:Type}`标记扩展. (12认同)
  • 这在使用{x:Static A + B.AnEnumValue}时有效 (8认同)
  • 具体来说,这是可能的 ** 在字符串中**(例如属性值)。作为元素名称(如答案所示),这是不允许的,因为结果将不再是有效的 XML;`+` 不是有效的名称字符。 (3认同)
  • @Ludovic:也不适用于WPF. (2认同)

Ash*_*non 32

我正在搜索和搜索,因为如果这是可能的,我想知道.不幸的是,我在msdn上发现了这个:

您的自定义类不能是嵌套类.嵌套类和一般CLR使用语法中的"点"会干扰其他WPF和/或XAML功能,例如附加属性.

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


Too*_*eve 6

.财产 ; 不知道为什么XAML也不能搜索嵌套类,但不是。


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

<Label SomeProperty1="{x:Static local:A+B.SomeProperty2}" />
Run Code Online (Sandbox Code Playgroud)

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

因此,元素名称不能直接描述嵌套类。
但是请参阅下面的UPDATE-解决此问题的替代语法。


更新
@Artfunkel对一个答案的评论,这应该是一种解决方案[我尚未测试]:

<x:Type TypeName="local:A+B"/>
Run Code Online (Sandbox Code Playgroud)

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

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