使用ItemContainerGenerator.ContainerFromItem方法可以擷取對應資料的UIElement 。
但是如果使用了虛拟化技術,超出可見區域的UIElement就擷取不到了。
參考微軟的文檔《如何:在 TreeView 中查找 TreeViewItem》,去掉一些不必要的和過時的代碼,寫了一個完整的例子。
主要代碼隻有5行
1 itemsControl.ApplyTemplate();
2 var itemsPresenter = FindVisualChild<ItemsPresenter>(itemsControl);
3 itemsPresenter.ApplyTemplate();
4 var virtualizingStackPanel = (VirtualizingStackPanel)VisualTreeHelper.GetChild(itemsPresenter, 0);
5 virtualizingStackPanel.BringIndexIntoViewPublic(data.index);
通過這樣的處理,就可以取到UIElement啦。
itemsControl = (ItemsControl)itemsControl.ItemContainerGenerator.ContainerFromItem(vm);
Demo運作效果圖
完整示例在我的Github中