FrameworkElement.FindName(String) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
擷取具有指定識別碼名稱的物件。
public:
virtual Platform::Object ^ FindName(Platform::String ^ name) = FindName;
IInspectable FindName(winrt::hstring const& name);
public object FindName(string name);
function findName(name)
Public Function FindName (name As String) As Object
參數
- name
-
String
Platform::String
winrt::hstring
要求物件的名稱。
傳回
要求的 物件。 如果在目前的 XAML 名稱範圍中找不到相符的物件,則這可以是 Null。
備註
重要
若要有效地使用 FindName 方法,您應該瞭解 XAML 名稱範圍的概念,以及如何在 XAML 載入時間建立 XAML 名稱範圍,然後在執行時間參考並可能修改。 如需詳細資訊,請參閱 XAML 名稱範圍。
Windows 執行階段程式碼中最常見的 FindName 用法,是從 XAML 頁面產生的InitializeComponent呼叫中。 在此情況下,只有在載入 XAML 頁面之後,才會叫用 FindName。 InitializeComponent 提供基礎結構,讓 XAML 載入所具現化的任何物件都能方便由程式碼後置程式碼存取。 然後,您可以將 物件參考為與標記宣告 之 x:Name 屬性共用相同名稱的變數。
FindName 之類的執行時間 API 正針對應用程式的執行時間物件樹狀結構運作,因為它存在於記憶體中。 從範本或執行時間載入 XAML 建立此物件樹狀結構的一部分時,XAML 名稱範圍通常不會連續在該物件樹狀結構內。 結果是指定的 FindName 範圍找不到物件樹狀結構中可能有具名物件。 您在一般應用程式案例中可能會遇到的 XAML 命名範圍之間不連續的情況是套用範本來建立物件,或呼叫 XamlReader.Load 建立物件時,然後新增至物件樹狀結構。
如果您針對 FindName 傳回非預期的 Null 結果,請嘗試下列技術:
- 針對來自範本的具名物件,如果您要定義或衍生自控制項,您可以從套用範本的物件範圍呼叫 GetTemplateChild 。 您必須位於衍生類別定義範圍中,才能使用 GetTemplateChild,因為它是 Control 的受保護方法。
- 如果您不在衍生類別定義範圍中,您可以在套用範本 (處理Loaded事件) 之後,在物件存留期的某個時間點使用VisualTreeHelper來輸入範本的視覺化樹狀結構。 VisualTreeHelper 使用父子式隱喻來逐步執行樹狀結構,而不是使用 XAML 名稱範圍概念。 逐步執行樹狀結構通常需要控制群組合的特定知識,因為它來自指定的範本。 您可以在控制項上使用 VisualTreeHelper.GetChild 來取得控制項的套用範本根目錄,並特別呼叫範本根目錄上的 FindName,以存取範本 XAML 內具名的專案。
- 針對 XamlReader.Load 案例,您應該保留 XamlReader.Load 呼叫之傳回值的參考,這是將成為相關之已建立之 XAML 名稱範圍擁有者或基礎的物件。 然後改為從該範圍呼叫 FindName。
FindName 所傳回的物件不一定是 FrameworkElement。 例如,您可以將名稱套用至動畫分鏡腳本,而各種動畫腳本類型不會衍生自 FrameworkElement。
物件名稱屬性 (或類似的 x:Name 屬性) ,方法是在 XAML 標記中的物件專案上指定屬性。 您可以在載入初始來源 XAML 之後設定 Name 值,但這項技術有一些限制, (請參閱 名稱) 中的。
TextElement 會定義類似的 FindName。 這可在物件模型中啟用 FindName 行為,這不限於 FrameworkElement。 任一個 FindName 實作的呼叫都可以周遊至混合 的 FrameworkElement / text 元素物件樹狀結構,並使用通用的 XAML 名稱範圍,讓 FrameworkElement.FindName 呼叫可以找到具名文字元素,反之亦然。
在物件樹狀目錄中的執行時間新增或變更的名稱值,將會更新為物件樹狀結構中該層級的動作 XAML 名稱範圍。 換句話說,如果您建立新的 FrameworkElement,請指定 Name,然後將它新增至物件樹狀結構,從該 XAML 名稱範圍內呼叫 FindName,即可尋找並傳回程序代碼建立的物件。