存取 XAML 資料範本中嵌入的控制項:實用指南
您正在使用利用 DataTemplates 來顯示資料的 FlipView,您的目標是存取目前所選範本中的特定 Image 控制項。 雖然 VisualTreeHelper.FindChildControl
看起來像是解決方案,但在處理轉發器控制項及其索引項目的動態特性時,它存在不足。
挑戰:動態產生的模板
核心問題源自於XAML中繼器如何處理DataTemplates。 在這些模板中指派和依賴控制項的 Name
屬性是不可靠的,因為每個重複的項目都會產生自己的實例,從而導致命名衝突。
解:視覺樹遍歷
有效的方法包括導航視覺化樹以找到目標控制項。此過程包含三個關鍵步驟:
辨識項目容器:使用ItemContainerGenerator.ContainerFromItem
來找出為所選項目產生的容器。
視覺化樹探索: 使用 VisualTreeHelper.GetChildrenCount
和 VisualTreeHelper.GetChild
遞歸搜尋容器的子元素。
控件識別: 過濾檢索到的控件,根據其類型 (Image
) 以及必要時的名稱(例如“img1”)來隔離所需的圖像控件。
這是說明此解決方案的程式碼範例:
<code class="language-csharp">var container = models_list.ItemContainerGenerator.ContainerFromItem(models_list.SelectedItem); var children = AllChildren(container); var img = children.OfType<Image>().FirstOrDefault(x => x.Name == "img1"); </code>
遞歸視覺樹遍歷函數 (AllChildren
)
遞歸函數AllChildren
對於探索整個視覺樹至關重要:
<code class="language-csharp">private 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); if (child is Control) { list.Add(child as Control); } list.AddRange(AllChildren(child)); } return list; }</code>
此函數有系統地遍歷視覺化樹,將所有 Control
元素加入清單。
定位影像控制項
使用 AllChildren
取得所有子控制項後,OfType<Image>().FirstOrDefault(x => x.Name == "img1")
行過濾列表,傳回名為「img1」的第一個 Image
控制項。 使用 FirstOrDefault
處理可能找不到影像的情況。
重要注意事項:
models_list.SelectedItem
不為空。 FlipView
使用多個 DataTemplates,您需要調整過濾邏輯以準確識別正確的模板容器。 考慮向您的模板添加唯一標識符以促進這一點。 這種改進的方法提供了一種強大而可靠的方法來存取動態生成的 XAML 資料模板中的控件,甚至在像 FlipView
.
以上是如何存取中繼器控制項中 XAML 資料模板內的控制項?的詳細內容。更多資訊請關注PHP中文網其他相關文章!