【WPF學習】第三章 使用其他名稱空間中的類型


    前面已經介紹了如何在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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM