-
- 可以在 XAML 中使用任何类型的.NET对象(甚至是COM对象),也可以使用自己定义的对象,无论这些对象是不是与用户界面有关。对象必须以“友好声明”(declarative-friendly)的方式进行设计。
- 对于不是专门为 XAML 设计的程序集,仍然可以在 XAML 中使用。
- 当转换子元素时,任何一个有效的 XAML 解析器或者编译器必须遵循下面的规则:
- 如果该类型实现了 IList 接口,就为每个子元素调用 IList.Add
- 否则,如果该类型实现了 IDictionary 接口,就为每个子元素调用 IDictionary.Add,在该值的键和元素中使用 x:Key 的特性值
- 否则,如果父元素支持内容属性,而且子元素的类型与该内容属性是兼容的,就把子元素作为它的属性值
- 否则,如果子对象是普通文本,且有类型转换器将子对象转换为父类型(没有在父元素上设置属性),则把子元素作为类型转换器的输入,将输出作为父对象的实例
- 其它情况,则抛出一个错误
2.7.4 XAML 扩展部分
例如:
在 mscorlib.dll 中的 .NET Framework API:
System.Collections.Hashtable h = new System.Collections.Hashtable();
h.Add("key1", 7);
h.Add("key2", 23);
如果要在 XAML 中引用上面程序集中的 API,可以表示为:
<collections:Hashtable
xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<sys:Int32 x:Key="key1">7</sys:Int32>
<sys:Int32 x:Key="key2">23</sys:Int32>
</collections:Hashtable>
其中:clr-namespace标记允许直接在 XAML 中放入一个 .NET 命名空间。