x:Name 屬性
更新:2007 年 11 月
唯一識別物件項目,目的是為了從程式碼後置 (Code-Behind) 或一般程式碼存取具現化 (Instantiated) 項目。套用至支援程式撰寫模型 (Programming Model) 之後,x:Name 即可視為等同於由建構函式傳回,用於保存物件參考的變數。
XAML 屬性使用方式
<object x:Name="XAMLNameValue".../>
XAML 值
XAMLNameValue |
符合 XamlName 文法之限制的字串。 |
備註
在使用 XAML、部分類別和程式碼後置 (Code-Behind) 之 WPF 應用程式專案的標準組建組態下,指定的 x:Name 在處理 XAML 時,會變成基礎程式碼中建立的欄位名稱,而欄位中會保存對物件的參考。
根據預設,建立的欄位是內部欄位。您可以指定 x:FieldModifier 屬性 (Attribute) 來變更欄位存取。
對於使用 Microsoft Visual Basic .NET 目標且包含 XAML 檔案的應用程式,則會在編譯期間建立個別參考屬性,將 WithEvents 關鍵字加入至具有 x:Name 的所有項目,以支援事件處理常式 (Event Handler) 委派的 Handles 語法。這個屬性一定是公用的。如需詳細資訊,請參閱 Visual Basic 和 WPF 事件處理。
x:Name 在名稱範圍內必須是唯一的。在大部分常見的 XAML 案例中,主要的命名範圍是由包含在單一 XAML 頁面中的項目所定義。其他的獨立命名範圍,是由頁面中定義的任何其他範本定義。如需名稱範圍考量的詳細資訊,請參閱 WPF 命名範圍。
XAML 處理器使用 x:Name 將名稱註冊到命名範圍,即使是未編譯之頁面的狀況也一樣 (例如鬆散的 XAML)。這是因為 ElementName 繫結可能需要 x:Name。如需詳細資訊,請參閱資料繫結概觀。
x:Name 無法套用到 WPF 程式設計中的某些範圍。例如,ResourceDictionary 中的項目不能有名稱,因為 ResourceDictionary 有一個特別的行為,會將本身定義為 XAML 命名範圍,但對主要 INameScope API 傳回「未實作」。
x:Name 的允許規則以及唯一性範圍的界定都是由基礎 Windows Presentation Foundation (WPF) 架構實作所定義,該實作將各種標記項目分成不同的 NameScope 範圍,例如資源字典、頁面層級 XAML 建立的邏輯樹狀結構、範本等等。
某些 WPF 架構應用程式或許可以避免使用任何 x:Name 屬性 (Attribute),因為 WPF 命名空間內針對諸如 FrameworkElement/FrameworkContentElement 等幾個重要基底類別所指定的 Name 相依性屬性,可以達到相同的目的。另外還有某些常見的 XAML 和架構案例必須以程式碼存取沒有 Name 屬性的項目,尤其是某些動畫和腳本支援類別。例如,如果您想從程式碼參考在 XAML 中建立的時刻表和轉換,則應該在這些時刻表和轉換上指定 x:Name。
如果 Name 可做為類別上的屬性 (Property) 使用,則可以交替使用 Name 和 x:Name 做為屬性 (Attribute),但是如果在同一個項目上同時指定兩者,則會產生錯誤。
若為自訂項目,可以在屬性 (Property) 宣告程式碼中使用 RuntimeNamePropertyAttribute 指定屬性,以建立或變更在任何特定物件上對應至 x:Name 的屬性 (可以是 CLR 屬性或相依性屬性)。
設定 Name 的方法包括使用 XAML 屬性 (Attribute) 語法、在程式碼中使用 SetValue;不過請注意,在某些情況中,在程式碼中設定 Name 屬性 (Property) 並不會在命名範圍內建立代表欄位參考。針對適當的命名範圍,在程式碼中使用 NameScope 方法,而不要嘗試在程式碼中設定 Name。
Name 也能使用 XAML 屬性 (Property) 項目語法和內部文字設定,但這不是一般的做法。x:Name 不能在 XAML 屬性項目語法中設定,或使用 SetValue 在程式碼中設定,只能使用項目上的屬性 (Attribute) 語法設定。