天天看點

【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>      

作者:Peter Luo

出處:https://www.cnblogs.com/Peter-Luo/

本文版權歸作者和部落格園共有,歡迎轉載,但必須給出原文連結,并保留此段聲明,否則保留追究法律責任的權利。