UWP中获取FlipView子元素:如何找到Item内的Grid控件
UWP FlipView获取DataTemplate内Grid的解决方法
问题原因
FlipView的ItemTemplate属于数据模板,其中的元素是数据项可视化容器的一部分,只有当对应项处于激活(当前显示)状态时才会被实例化并加入可视化树。直接调用FindChild()返回null,通常是因为目标元素还未加载,或者没有定位到正确的容器对象。
解决方法
方法一:获取当前激活项的容器并遍历可视化树(推荐)
这种方法能拿到FlipView中正在显示的Grid实例:
- 先获取当前选中项对应的
FlipViewItem容器:var currentContainer = flipView.ContainerFromItem(flipView.SelectedItem) as FlipViewItem; - 封装一个可视化树查找方法,遍历容器的子元素:
private T FindVisualChild<T>(DependencyObject parent) where T : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) { var child = VisualTreeHelper.GetChild(parent, i); if (child is T target) return target; var foundChild = FindVisualChild<T>(child); if (foundChild != null) return foundChild; } return null; } - 等待容器加载完成后查找目标Grid:
if (currentContainer != null) { currentContainer.Loaded += (sender, e) => { var sampleGrid = FindVisualChild<Grid>(currentContainer); if (sampleGrid != null && sampleGrid.Name == "SampleGrid") { // 在这里对找到的Grid进行操作 } }; }
方法二:直接加载模板内容(仅适用于非当前显示元素的场景)
如果只是需要获取模板中Grid的实例(不是FlipView正在显示的那个),可以直接加载模板内容:
var template = flipView.ItemTemplate; var templateRoot = template.LoadContent() as FrameworkElement; var sampleGrid = templateRoot.FindName("SampleGrid") as Grid;
注意:这种方式得到的是新创建的实例,和FlipView中显示的元素无关,适合预渲染或自定义模板预览场景。
关键注意点
- 必须确保目标项已加载:FlipView默认开启虚拟化,未显示的项不会实例化模板元素,只有
SelectedItem对应的容器才会存在于可视化树中。 - 推荐在
SelectionChanged事件中处理:避免在FlipView的Loaded事件中直接查找,此时选中项的容器可能还未完成实例化。
内容的提问来源于stack exchange,提问作者Sumnoon
相关产品推荐
相关产品推荐

