使用 XAML DataTemplate 中嵌入的控件,尤其是在像 FlipView
這樣顯示多個資料項目的容器中,提出了獨特的挑戰。 由於潛在的命名衝突,透過名稱直接存取這些控制項是有問題的。 本指南提供了一個強大的解決方案。
核心問題在於 FlipView
(或類似容器)中的每個資料項目都會產生自己的 DataTemplate 實例,可能會建立重複的控制項名稱。 因此,簡單的基於名稱的查找會失敗。
解決方案涉及遍歷所選項目的視覺化樹以找到所需的控制項。 遞歸方法提供了一種優雅且有效率的方法:
<code class="language-csharp">public List<Control> AllChildren(DependencyObject parent) { var list = new List<Control>(); for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) { var child = VisualTreeHelper.GetChild(parent, i); list.Add(child as Control); // Add the child if it's a Control list.AddRange(AllChildren(child)); // Recursively search children } return list; }</code>
此方法遞歸地探索給定父級的所有子控制項。 要將其應用到我們的FlipView
,我們使用以下內容:
<code class="language-csharp">if (MyFlipView.SelectedItem == null) return; var container = MyFlipView.ItemContainerGenerator.ContainerFromItem(MyFlipView.SelectedItem); var children = AllChildren(container); var img1 = children.OfType<Image>().FirstOrDefault(x => x.Name == "img1"); </code>
此程式碼片段首先擷取所選 FlipView
項目的容器。 然後,它使用 AllChildren
方法來取得所有子控制項的清單。最後,它使用 LINQ 的 OfType<Image>()
來過濾列表中的 Image
控件,並使用 FirstOrDefault()
來尋找名為「img1」的控件。 使用 FirstOrDefault()
處理可能找不到控制的情況,回傳 null
而不是拋出異常。
這種方法確保我們準確定位所選項目的 DataTemplate 中的特定控件,有效解決命名衝突問題。 請記得將 "img1"
替換為目標控制項的實際名稱。
以上是如何存取 XAML 資料模板中的命名控制項?的詳細內容。更多資訊請關注PHP中文網其他相關文章!