程式碼後置和 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 指示詞項目

請參閱

概念

XAML 概觀

建置 WPF 應用程式 (WPF)

XAML 語法術語

參考

x:Code XAML 指示詞項目