WPF 中的程式碼後置和 XAML
程式碼後置一詞係用來描述對 XAML 頁面進行標記編譯時與標記定義之物件聯結的程式碼。 本主題描述程式碼後置的需求,以及 XAML 中程式碼的另類內嵌程式碼機制。
本主題包含下列幾節:
必要條件
本主題假設您已閱讀 WPF 中的 XAML ,並對 CLR 和物件導向程式設計有基本的認識。
程式碼後置和 XAML 語言
XAML 語言包含語言等級功能,可讓您從標記檔案端將程式碼檔案與標記檔案產生關聯。 具體來說,XAML 語言會定義 x:類別指示詞、 x:子類別指示詞和 x:ClassModifier 指示詞的語言功能。 確切地說,應該如何產生程式碼,以及如何整合標記和式碼,不是 XAML 語言所指定的一部分。 它由 WPF 等框架來確定如何整合程式碼、如何在應用程式和程式設計模型中使用 XAML,以及所有這些所需的建置操作或其他支援。
WPF 中的程式碼後置、事件處理常式和部分類別需求
部分類別必須從支援根元素的類型衍生而來。
請注意,在標記編譯建置動作的預設行為下,您可以在程碼後置端的部分類別定義中保留空白衍生。 編譯的結果會假設頁面根的備份類型是部分類別的基礎,即使未指定也一樣。 不過,依賴此行為並不是最佳做法。
您在程式碼後置中寫入的事件處理常式必須是實例方法,而且不能是靜態方法。 這些方法必須由
x:Class
所識別之 CLR 命名空間內的部分類別定義。 您無法限定事件處理常式的名稱,以指示 XAML 處理器在不同的類別範圍中尋找事件處理常式以進行事件連接。處理常式必須符合支援類型系統中適當事件的委派。
特別是針對 Microsoft Visual Basic 語言,您可以使用特定語言的
Handles
關鍵字,將處理常式與處理常式宣告中的實例和事件產生關聯,而不是將處理常式附加至 XAML 中的屬性。 不過,這項技術確實有一些限制,因為Handles
關鍵字無法支援 WPF 事件系統的所有特定功能,例如特定路由事件案例或附加事件。 如需詳細資訊,請參閱 Visual Basic 和 WPF 事件處理。
x:程式碼
x:程式碼 是 XAML 中定義的指示詞元素。 x:Code
指示詞元素可以包含內嵌程式設計程式碼。 定義為內嵌的程式碼可以與相同頁面上的 XAML 互動。 下列範例說明內嵌 C# 程式碼。 請注意,程式碼位於 x:Code
元素內,而且程式碼必須以 <CDATA[
...]]>
引號括住以逸出 XML 的內容,因此 XAML 處理器(解譯 XAML 結構描述或 WPF 結構描述)不會嘗試將內容解譯為 XML。
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://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 產生的部分類別,而且只能使用預設的 XML 命名空間對應。 因為您無法新增 using
語句,所以您必須完整限定您進行的許多 API 呼叫。 預設的 WPF 對應包含 WPF 元件中存在的大部分,但不包含所有 CLR 命名空間;您必須完整限定其他 CLR 命名空間中包含的類型和成員呼叫。 您也無法在內嵌程式碼中定義超出部分類別以外的任何元素,而且您參考的所有使用者程式碼實體必須在產生的部分類別中以成員或變數的形式存在。 其他語言特定的程式設計功能,例如巨集或針對全域變數或建置變數的 #ifdef
,也無法使用。 如需詳細資訊,請參閱 x:程式碼內建 XAML 類型。