x:Name 指示詞
可唯一識別 XAML 命名範圍中 XAML 定義的元素。 當架構提供 API 或實作在運行時間存取 XAML 建立的物件圖形時,XAML 命名範圍及其唯一性模型可以套用至具現化物件。
XAML 屬性使用方式
<object x:Name="XAMLNameValue".../>
XAML 值
價值 | 描述 |
---|---|
XAMLNameValue |
符合 XamlName 文法限制的字串。 |
言論
x:Name
套用至架構支援程序設計模型之後,名稱就相當於保留建構函式所傳回之對象參考或實例的變數。
x:Name
指示詞使用方式的值在 XAML 命名範圍內必須是唯一的。 根據預設,.NET XAML 服務 API 使用時,主要 XAML 名稱範圍定義於單一 XAML 生產環境的 XAML 根元素,並包含該 XAML 生產中包含的專案。 在單一 XAML 生產環境中可能發生的其他離散 XAML 命名範圍可由架構定義,以解決特定案例。 例如,在 WPF 中,新的 XAML 命名範圍是由任何同時在該 XAML 生產環境上定義的範本所定義和建立。 如需 XAML 命名範圍的詳細資訊(針對 WPF 撰寫,但與許多 XAML 命名範圍概念相關),請參閱 WPF XAML Namescopes。
一般而言,x:Name
不應該在也使用 x:Key
的情況下套用。 特定現有架構的 XAML 實作在 x:Key
與 x:Name
之間引進了替代概念,但這不是建議的做法。 處理名稱/金鑰資訊,例如 INameScope 或 DictionaryKeyPropertyAttribute時,.NET XAML 服務不支援這類替代概念。
允許 x:Name
的規則,以及特定實作架構可能會定義名稱唯一性強制執行的規則。 不過,若要與 .NET XAML 服務搭配使用,XAML 名稱範圍唯一性的架構定義應該與本檔中 INameScope 資訊的定義一致,而且應該使用相同的規則來套用資訊。 例如,Windows Presentation Foundation (WPF) 實作會將各種標記元素分割成個別的 NameScope 範圍,例如資源字典、頁面層級 XAML、範本和其他延遲內容所建立的邏輯樹狀結構,然後在每個 XAML 命名範圍中強制執行 XAML 名稱唯一性。
對於使用 .NET XAML 服務 XAML 物件寫入器的自定義類型,可以建立或變更對應至類型上 x:Name
的屬性。 您可以藉由參考屬性的名稱來定義此行為,以便與類型定義程式代碼中的 RuntimeNamePropertyAttribute 對應。
RuntimeNamePropertyAttribute 是類型層級屬性。
Using.NET XAML 服務,可以實作 INameScope 介面,以架構中性的方式定義 XAML 命名範圍支援的邏輯。
WPF 使用方式注意事項
在使用 XAML、部分類別和程式代碼後置之 WPF 應用程式的標準建置組態下,指定的 x:Name
會成為當 XAML 由標記編譯建置工作處理 XAML 時,基礎程式代碼中建立的功能變數名稱,且該欄位會保存物件的參考。 根據預設,建立的欄位是內部欄位。 您可以指定 x:FieldModifier 屬性來變更欄位存取權。 在 WPF 和 Silverlight 中,序列是標記編譯會定義並命名部分類別中的欄位,但值一開始是空的。 然後,從類別建構函式內呼叫名為 InitializeComponent
的產生方法。
InitializeComponent
是由 FindName
呼叫所組成,每個 x:Name
值都存在於部分類別的 XAML 定義部分做為輸入字串。 傳回值接著會指派給類似命名的欄位參考,以使用從 XAML 剖析建立的物件填入域值。 執行 InitializeComponent
可讓您直接使用 x:Name
/ 功能變數名稱來參考運行時間物件圖形,而不需要在需要 XAML 定義物件的參考時明確呼叫 FindName
。
對於使用 Microsoft Visual Basic 目標的 WPF 應用程式,並包含具有 Page
建置動作的 XAML 檔案,編譯期間會建立個別的參考屬性,將 WithEvents
關鍵詞新增至具有 x:Name
的所有元素,以支援事件處理程式委派的 Handles
語法。 此屬性一律為公用。 如需詳細資訊,請參閱 Visual Basic 和 WPF 事件處理。
WPF XAML 處理器會使用 x:Name
在載入時向 XAML 命名範圍註冊名稱,即使頁面不是透過建置動作編譯標記的情況(例如資源字典的鬆散 XAML)。 此行為的其中一個原因是 x:Name
可能需要 ElementName 系結。 如需詳細資訊,請參閱 資料系結概觀。
如先前所述,x:Name
(或 Name
)不應在也使用 x:Key
的情況下套用。 WPF ResourceDictionary 有一種特殊行為,其行為是將本身定義為 XAML 命名範圍,但針對 INameScope API 傳回「未實作」或 Null 值,做為強制執行此行為的方法。 如果WPF XAML 剖析器在 XAML 定義 ResourceDictionary中遇到 Name
或 x:Name
,則不會將名稱新增至任何 XAML 命名範圍。 嘗試從任何 XAML 名稱範圍尋找該名稱,且 FindName
方法將不會傳回有效的結果。
x:Name and Name
許多 WPF 應用程式案例都可以避免使用 x:Name
屬性,因為 Name
相依性屬性,如 FrameworkElement 和 FrameworkContentElement 等幾個重要基類的預設 XAML 命名空間中所指定的相依性屬性符合相同的目的。 仍有一些常見的 XAML 和 WPF 案例,其中程式代碼存取在架構層級上沒有 Name
屬性的專案很重要。 例如,某些動畫和分鏡腳本支持類別不支援 Name
屬性,但是它們通常需要在程式代碼中參考,才能控制動畫。 如果您想要稍後從程式代碼參考,您應該將 x:Name
指定為時間軸上的屬性,並在 XAML 中建立的轉換。
如果 Name 可作為 類別上的屬性,Name 和 x:Name
可以交替使用作為屬性,但如果兩者都指定在相同的元素上,就會產生剖析例外狀況。 如果 XAML 已編譯標記,則會在標記編譯時發生例外狀況,否則會在載入時發生。
Name 可以使用 XAML 屬性語法設定,並使用 SetValue在程式代碼中設定;不過請注意,在程式代碼中設定 Name 屬性並不會在已載入 XAML 的情況下,在 XAML 命名範圍中建立代表性字段參考。 不要嘗試在程式代碼中設定 Name,而是對適當的命名範圍使用程式代碼中的 NameScope 方法。
您也可以使用屬性元素語法搭配內部文字來設定 Name,但這並不常見。 相反地,x:Name
無法在 XAML 屬性元素語法中設定,或是使用 SetValue的程式代碼中設定;它只能在物件上使用屬性語法來設定,因為它是 指示詞。
Silverlight 使用量注意事項
Silverlight 的 x:Name
會個別記載。 如需詳細資訊,請參閱 XAML 命名空間 (x:) 語言功能 (Silverlight)。
另請參閱
- FrameworkElement.Name
- FrameworkContentElement.Name
- WPF 中的
樹狀結構