程式碼後置和 XAML
更新:2007 年 11 月
程式碼後置 (Code-Behind) 一詞是用來描述將 XAML 頁面編譯成應用程式時,與 XAML 處理器建立之程式碼聯結 (Join) 的程式碼。本主題說明程式碼後置的需求,以及 XAML 中程式碼的替代內嵌程式碼機制。
這個主題包含下列章節。
- 必要條件
- 程式碼後置、事件處理常式和部分類別需求
- x:Code
- 內嵌程式碼限制
- 相關主題
必要條件
本主題假設您已讀過 XAML 概觀,而且有一些 CLR 和物件導向程式設計的基本知識。
程式碼後置、事件處理常式和部分類別需求
部分類別 (Class) 必須衍生自當做根項目 (Root Element) 之類別的型別。您可以在程式碼後置中,將部分類別定義中的衍生設定留白,但是即使未指定,編譯的結果還是會採用頁面根項目做為部分類別的基底類別 (因為部分類別的標記部分已將頁面根項目指定為基底)。
您所撰寫的事件處理常式必須是部分類別在 x:Class 識別之 CLR 命名空間內定義的執行個體方法。您不能限制事件處理常式的名稱,以指示 XAML 處理器在不同的類別範圍中尋找該處理常式。您也不能使用靜態方法做為事件處理常式。
處理常式必須符合適當事件的委派。
您可特別針對 Microsoft Visual Basic .NET 語言,使用語言特定 Handles 關鍵字建立處理常式與處理常式宣告中執行個體和事件的關聯,而不必附加處理常式與 XAML 中的屬性 (Attribute)。不過,這種方法有一些限制,因為 Handles 不能支援 WPF 事件系統的所有特定功能,例如特定路由事件案例或附加事件。如需詳細資訊,請參閱 Visual Basic 和 WPF 事件處理。
x:Code
x:Code 是定義在 XAML 中的指示詞項目。x:Code 指示詞項目可以包含內嵌程式碼。這種以內嵌方式定義的程式碼可以與相同頁面上的 XAML 互動。下列範例顯示內嵌的 C# 程式碼。請注意此程式碼位於 x:Code 項目內,而且程式碼必須放在 <CDATA[...]]> 中,以逸出 XML 的內容,XAML 處理器 (解譯 XAML 結構描述或 WPF 結構描述) 才不會嘗試依字面將內容解譯為 XML。
<Page
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyNamespace.MyCanvasCodeInline"
>
<Button Name="button1" Click="Clicked">Click Me!</Button>
<x:Code><![CDATA[
void Clicked(object sender, RoutedEventArgs e)
{
button1.Content = "Hello World";
}
]]></x:Code>
</Page>
內嵌程式碼限制
您應該考慮避免或限制在 XAML 架構應用程式中使用內嵌程式碼。就架構和程式碼撰寫原理而言,將標記和程式碼後置分開,可以讓設計人員和開發人員的角色更為涇渭分明。就較為技術性的層面來看,撰寫內嵌程式碼的難度可能較高,因為您總是寫入 XAML 頁面產生的部分類別,而且只能使用預設 XML 命名空間對應。因為您不能加入 using 陳述式,所以必須完整限定您所進行的許多 API 呼叫。預設 WPF 對應包括存在 WPF 組件中的多數 (但非全部) CLR 命名空間;您必須完全限定對包含在其他 CLR 命名空間內之 API 的呼叫。您也不能在內嵌程式碼中定義多個類別,而且所有的程式碼實體 (Entity) 全都必須以成員或變數的形式存在產生的部分類別內。其他語言特定的程式設計功能,例如巨集或相對於全域變數或建置變數的 #ifdef,也無法使用。如需詳細資訊,請參閱 x:Code XAML 指示詞項目。