前面已经介绍了如何在 XAML 中使用 WPF 中的类来创建基本的用户界面. 但 XAML 是实例化. NET 对象的通用方法, 包括那些位于其他非 WPF 名称空间以及自己创建的名称空间中的对象.
创建那些不是用于在 XAML 窗口中显示的对象听起来像是多余的, 但在很多情况下这是需要的. 一个例子是, 但使用数据绑定并希望在某个控件上显示从其他对象提取的信息时. 另外一个例子是希望使用非 WPF 对象为 WPF 对象设置属性时.
例如, 可使用数据对象填充 WPF 的 ListBox 控件. ListBox 控件将调用 ToString() 方法来获取文本, 以便在列表中显示每个条目.
为使用未在 WPF 名称空间中定义的类. 需要将. NET 名称空间映射到 xml 名称空间. XAML 有一种特殊的语法可用于完成这一工作, 该语法如下所示:
xmlns:Prefix="clr-namespace:Namespace;assembly=AssemblyName"
通常, 在 XAML 文档的根元素中, 在紧随声明 WPF 和 XAML 名称空间的特性之后放置这个名称空间. 还需要使用适当的信息填充三个斜体部分, 这三部分的含义如下:
Prefix 是希望在 XAML 标记中用于指示名称空间的 xml 前缀. 例如, XAML 语法使用 x 前缀.
Namespace 是完全限定的. NET 名称空间的名称.
AssemblyName 是声明类型的程序集, 没有. dll 扩张名. 这个程序集必须在项目中引用. 如果希望使用项目程序集, 可以忽略这一部分.
例如, 下面的标记演示了如何范围 System 名称空间中的基本类型, 并将其映射为前缀 sys:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
现在, 为了创建其中一个名称空间中的类的实例, 可使用名称空间前缀:
<sys:DateTime>2019-12-30 12:20:00</sys:DateTime>
理想情况是, 希望在 XAML 中使用的每个类都有无参构造函数. 如果具有无参构造函数, XAML 解析器就可创建对应的对象, 设置其属性, 并关联所提供的任何事件处理程序. XAML 不支持有参构造函数, 而且 WPF 中的所有元素都包含无参构造函数. 此外, 需要能够使用公共属性设置所期望的所有细节. XAML 不允许设置公共字段或调用方法.
如果想要使用的类没有无参构造函数, 就有一些限制. 如果试图创建简单的基本类型 (如字符串, 日期或数字类型), 可提供数据的字符串表示形式作为标签中的内容. XAML 解析器接着将使用类型转换器将字符串转换为合适的对象. 如上面代码段所示, 例举了一个使用 DateTime 结构的例子.
因为 DateTime 类使用 TypeConverter 特性将自身关联到 DateTimeConverter 类, 所以上面的标记可以凑效. DateTimeConverter 类知道这个字符串是合法的 DateTime 对象, 并对其进行转换. 当使用该技术时, 不能使用特性为对象设置任何属性.
下面示例将所有这些概念融合在一起. 将 sys 前缀映射到 System 名称空间, 并使用 System 名称空间创建三个 DateTime 对象, 然后用这三个 DateTime 对象填充一个列表:
- <Windows x:Class="WpfApplication1.DateTimeWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:sys="clr-namespace:System;assembly=mscorlib"
- Title="DateTimeWindow" Height="300" Width="300">
- <ListBox>
- <ListBoxItem>
- <sys:DateTime>2019-12-30 12:20:00</sys:DateTime>
- </ListBoxItem>
- <ListBoxItem>
- <sys:DateTime>2019-12-31 12:20:00</sys:DateTime>
- </ListBoxItem>
- <ListBoxItem>
- <sys:DateTime>2019-12-3 12:20:00</sys:DateTime>
- </ListBoxItem>
- </ListBox>
- </Windows>
来源: http://www.bubuko.com/infodetail-3366007.html