前面已經介紹了如何在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對象填充一個列表:
<Window 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> </Window>
