1. 程式人生 > >WPF基礎之XAML----(XAML 根元素和 xmlns,事件和 XAML 程式碼隱藏)

WPF基礎之XAML----(XAML 根元素和 xmlns,事件和 XAML 程式碼隱藏)

XAML 根元素和 xmlns

一個 XAML 檔案只能有一個根元素,這樣才能成為格式正確的 XML 檔案和有效的 XAML 檔案。通常,應選擇屬於應用程式模型一部分的元素(例如,為頁面選擇 Window 或 Page,為外部字典選擇 ResourceDictionary,或為應用程式定義根選擇 Application)。下面的示例演示 WPF 頁面的典型 XAML 檔案的根元素,其中的根元素為 Page。


根元素還包含屬性 xmlns 和 xmlns:x。這些屬性向 XAML 處理器指明哪些名稱空間包含標記將要引用的元素的元素定義。xmlns 屬性專門指示預設的 xmlns 名稱空間。在預設的 xmlns 名稱空間中,可以不使用字首指定標記中的物件元素。對於大多數 WPF 應用程式方案以及 SDK 的 WPF 部分中給出的幾乎所有示例,預設的 xmlns 名稱空間均對映為 WPF 名稱空間

http://schemas.microsoft.com/winfx/2006/xaml/presentation。xmlns:x 屬性指示另外一個 xmlns 名稱空間,該名稱空間對映 XAML 語言名稱空間 http://schemas.microsoft.com/winfx/2006/xaml。在具有此對映的檔案的標記中引用時,XAML 規範定義的必需語言元件帶有 x: 字首。使用 xmlns 定義用法範圍和對映的這種做法符合 XML 1.0 規範。請注意,xmlns 屬性僅在每頁的根元素上和應用程式定義上(如果在標記中提供了應用程式定義)才是嚴格必需的。xmlns 定義將應用於根的所有子元素。(此行為仍然符合 xmlns 的 XML 1.0 規範。)xmlns 屬性還允許出現在根下面的其他元素上,並且將應用於定義元素的任何子元素。但是,此用法並不典型,因為頻繁定義或重新定義 xmlns 名稱空間可能會導致 XAML 標記樣式難以閱讀。

由於存在屬於專案生成檔案一部分的配置,因此可以知道 WPF 程式集包含的某些型別支援 WPF 到預設 xmlns 的對映。程式集還對映到目標檔案中。因此,為了引用來自 WPF 程式集的 XAML 元素,只需對映 xmlns 即可。對於您自己的自定義程式集,或者除 WPF 之外的程式集,可以將該程式集指定為 xmlns 對映的一部分。通常,可選擇其他字首,但是也可以選擇其他 xmlns 作為預設值,然後將 WPF 對映到字首。

x: 字首
在前面的根元素示例中,字首 x: 用於對映 XAML xmlns http://schemas.microsoft.com/winfx/2006/xaml。在此 SDK 的專案模板、示例以及文件中,此 x: 字首將用於對映 XAML xmlns。x: 字首/XAML xmlns 包含多個將在 XAML 中頻繁用到的程式設計構造。下面列出了將用到的最常見 x: 字首/XAML xmlns 程式設計構造:

x:Key:為 ResourceDictionary 中的每個資源設定一個唯一的鍵。在應用程式標記中看到的所有 x: 用法中,x:Key 可能佔到 90%。

x:Class:向為 XAML 頁提供程式碼隱藏的類指定 CLR 名稱空間和類名。必須具有這樣一個類才能支援程式碼隱藏,也正是由於這個原因,即使沒有資源,您也幾乎總是會看到對映的 x:。

x:Name:處理物件元素後,為執行時程式碼中存在的例項指定執行時物件名稱。在不支援等效的 WPF 框架級Name 屬性的情況下命名元素時,可以使用 x:Name。某些動畫方案中會發生這種情況。

x:Static:啟用一個獲取靜態值的值引用,該靜態值只能是一個 XAML 可設定屬性。

x:Type:根據型別名稱構造一個 Type 引用。它用於指定採用 Type 的屬性 (Attribute),如 Style..::.TargetType,不過在許多情況下屬性 (Property) 本身具有字串到 Type 的轉換功能,因此使用 x:Type 是可選的。

x: 字首/XAML xmlns 中還有其他一些不太常見的程式設計構造。

事件和 XAML 程式碼隱藏

大多數 WPF 應用程式都是既包括標記,又包括程式碼隱藏。在一個專案中,XAML 被編寫為 .xaml 檔案,而使用 CLR 語言(如 Microsoft Visual Basic .NET 或 C#)編寫程式碼隱藏檔案。編譯 XAML 檔案時,每個 XAML 頁的 XAML 程式碼隱藏檔案的位置是通過指定一個名稱空間和類作為 XAML 頁的根元素的 x:Class 屬性來確定的。

在目前已介紹的示例中,您已看到幾個按鈕,但還沒有一個按鈕具有任何關聯的邏輯行為。為物件元素新增行為的主要應用程式級機制是使用元素類的現有事件,併為在執行時引發該事件時呼叫的該事件編寫特定的處理程式。事件名稱以及要使用的處理程式的名稱在標記中指定,而實現處理程式的程式碼在程式碼隱藏中定義。

請注意,程式碼隱藏檔案使用名稱空間 MyNamespace 並將 MyPageCode 宣告為該名稱空間內的一個分部類。這相當於在標記根中提供的 MyNamespace.MyPageCode 的 x:Class 屬性值。編譯器將通過從根元素型別派生一個類,自動為編譯的任何 XAML 頁建立一個分部類。當您提供也會定義同一分部類的程式碼隱藏時,將在與編譯的應用程式相同的名稱空間和類中組合生成的程式碼。

如果您不想建立單獨的程式碼隱藏檔案,還可以將程式碼內聯到 XAML 檔案中。但是,內聯程式碼是一種缺少多樣性的方法,有很多的限制。

XAML 頁面根元素剖析

下表顯示了一個典型的 XAML 頁面根元素分解結構,並顯示了本主題中介紹的根元素的具體屬性:

基類和 XAML
基礎 XAML 及其架構是一個類集合,這些類對應於 CLR 物件以及要在 XAML 中使用的標記元素。但是,並不是所有的類都能對映到元素。抽象類(如 ButtonBase)和某些非抽象基類在 CLR 物件模型中用於繼承,並且不支援對應的 XAML 標記。基類(包括抽象類)對於 XAML 開發仍然很重要,因為每個具體的 XAML 元素都從其層次結構中的某個基類繼承成員。通常,這些成員包括可以設定為元素屬性 (Attribute) 的屬性 (Property),或者可以處理的事件。FrameworkElement 是 WPF 在 WPF 框架級的具體 UI 基類。設計 UI 時,您將使用各種形狀、面板、修飾器或控制元件類,它們全部從 FrameworkElement 派生而來。有一個相關的基類 FrameworkContentElement,它使用可在 FrameworkElement 中特意映象 API 的 API,支援適合流佈局表示形式的面向文件的元素。元素級的屬性 (Attribute) 和 CLR 物件模型的組合提供了一組通用的屬性 (Property),可以在大多數具體的 XAML 元素上設定這些屬性 (Property),而不管確切的元素型別及其基礎類是什麼。

XAML 安全性
XAML 是一種直接表示物件例項化和執行的標記語言。因此,使用 XAML 建立的元素能夠像等效的生成程式碼那樣與系統資源進行互動(如網路訪問、檔案系統 IO)。

WPF 支援 .NET 安全框架程式碼訪問安全性 (CAS)。這意味著在 Internet 區域中執行的 WPF 內容具有更少的執行許可權。“鬆散 XAML”(由 XAML 檢視器在載入時解釋的未編譯 XAML 的頁面)和 XAML 瀏覽器應用程式 (XBAP) 通常在此 Internet 區域中執行,並且使用相同的許可權集。但是,載入到完全受信任的應用程式中的 XAML 與宿主應用程式具有相同的系統資源訪問許可權。有關更多資訊,請參見 Windows Presentation Foundation 部分信任安全性。

從程式碼中載入 XAML
XAML 可用於定義整個 UI,但有時也適合只使用 XAML 定義 UI 的一部分。利用此功能可以實現部分自定義、在本地儲存資訊、使用 XAML 提供業務物件或者各種可能的方案。這些方案的關鍵是 XamlReader 類及其 Load 方法。輸入是一個 XAML 檔案,而輸出是一個物件,它表示從該標記中建立的物件的整個執行時樹。然後您可以插入該物件,作為應用程式中已存在的另一個物件的屬性。只要該屬性在具有最終顯示功能並且將通知執行引擎已在應用程式中新增新內容的內容模型中是一個合適的屬性,您就可以通過以 XAML 形式載入來輕鬆地修改正在執行的應用程式的內容。請注意,通常只在完全受信任的應用程式中使用此功能,因為將檔案載入到正在執行的應用程式中會帶來明顯的安全隱患。