WPF 中的程式碼後置和 XAML

程式碼後置是一個詞彙,用來描述當 XAML 頁面經過標記編譯時,與標記定義物件聯結的程式碼。 本主題描述程式碼後置的需求,以及 XAML 中程式碼的替代內嵌程式碼機制。

本主題包含下列幾節:

必要條件

本主題假設您已閱讀 WPF 中的 XAML,並具備 CLR 和麵向物件程式設計的基本知識。

程式碼後置和 XAML 語言

XAML 語言包含語言層級功能,可讓您從標記檔案端將程式碼檔案與標記檔案產生關聯。 具體而言,XAML 語言會定義語言功能 x:Class 指示詞 x:Subclass 指示 詞和 x:ClassModifier 指示詞 。 確切地說,應該如何產生程式碼,以及如何整合標記和程式碼,不是 XAML 語言所指定專案的一部分。 它由 WPF 之類的架構決定如何整合程式碼、如何在應用程式和程式設計模型中使用 XAML,以及建置動作或其他所有需要的支援。

WPF 中的程式碼後置、事件處理常式和部分類別需求

  • 部分類別必須衍生自支援根項目的類型。

  • 請注意,在標記編譯建置動作的預設行為下,您可以在程式碼後置端的部分類別定義中保留空白衍生。 編譯的結果會假設頁面根的備份類型是部分類別的基礎,即使未指定也一樣。 不過,依賴此行為並不是最佳做法。

  • 您在程式碼後置中撰寫的事件處理常式必須是實例方法,而且不能是靜態方法。 這些方法必須由 所 x:Class 識別 CLR 命名空間內的部分類別定義。 您無法限定事件處理常式的名稱,以指示 XAML 處理器在不同的類別範圍中尋找事件處理常式以進行事件連接。

  • 處理常式必須符合支援類型系統中適當事件的委派。

  • 針對 Microsoft Visual Basic 語言,您可以使用語言特定 Handles 關鍵字,將處理常式與處理常式宣告中的實例和事件產生關聯,而不是將處理常式附加至 XAML 中的屬性。 不過,這項技術確實有一些限制,因為 Handles 關鍵字無法支援 WPF 事件系統的所有特定功能,例如特定路由事件案例或附加事件。 如需詳細資訊,請參閱 Visual Basic 和 WPF 事件處理

x:Code

x:Code 是 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:Code 內建 XAML 類型

另請參閱