在 XAML 文件(WPF UserControl)中,有没有办法引用另一个类“A”中定义的内部类“B”?
public class A
{
public class B
{
}
}
类似的东西:
<local:A.B ... />
此语法不起作用,因为“B”被解释为类“A”中名为“B”的属性。
我尝试了更多奇特的语法,如“::”或“+”,但似乎都没有。
我目前正在使用 Silverlight 4 与 VS2010 。
提前感谢您的帮助。
答案 0 :(得分:41)
这个问题很老了,我不知道它是否会在2010年使用WPF版本,但现在你可以通过使用嵌套类型的“真实”(内部)名称来使其工作:
<local:A+B />
如果你曾经看过一个反汇编的代码,那就是嵌套类型的样子:
ParentTypeName+Nested
答案 1 :(得分:32)
我正在搜索和搜索,因为如果这是可能的,我想知道。不幸的是,我在msdn上找到了这个:
您的自定义类不能是嵌套的 类。嵌套类和“点” 在它们的一般CLR使用语法中会干扰其他WPF和/或XAML 附加属性等功能。
因此,您似乎无法使用点运算符引用嵌套类。至于通过XAML进入内部类的替代方法,我的搜索还没有运气。 :o(但这是一个相当有趣的问题,所以我会继续搜索。也许我会找到一些运气!:o)
答案 2 :(得分:3)
.
是指属性;不知道为什么XAML也不能搜索嵌套类,但不是。
在字符串内(例如属性值)时,可以使用A+B
而不是A.B
来表示嵌套类 :>
<Label SomeProperty1="{x:Static local:A+B.SomeProperty2}" />
作为元素名称(如问题所示),不允许使用+
,因为结果将不再是有效的XML; +
不是有效的名称字符:
XAML is XML。
XML Spec - NameChar。
因此元素名称不能直接描述嵌套类。
但是请参阅下面的UPDATE-解决此问题的另一种语法。
更新
根据@Artfunkel对一个答案的评论,这应该是一种解决方案[我尚未测试]:
<x:Type TypeName="local:A+B"/>
发件人:https://docs.microsoft.com/en-us/dotnet/framework/xaml-services/x-type-markup-extension
TBD如何使用该语法指定 properties 。使用x:TypeArguments
?