获取 UI 中未显示的可视子项

本文关键字:可视 显示 UI 获取 | 更新日期: 2023-09-27 18:32:56

我使用以下DataTemplate创建了一个CheckedListBox控件:

<WrapPanel>
    <CheckBox x:Name="CheckBox" VerticalAlignment="Center"
    <ContentPresenter Content="{Binding}" Margin="5,2" />
</WrapPanel>

我编写了代码,我需要访问属于列表框项的复选框:

foreach (var value in Items)
{
    var item = ItemContainerGenerator.ContainerFromItem(value) as ListBoxItem;
    var checkBox = item?.GetVisualChildren<CheckBox>().FirstOrDefault();
}
public static IEnumerable<T> GetVisualChildren<T>(this DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                yield return (T)child;
            }
            foreach (T childOfChild in GetVisualChildren<T>(child))
            {
                yield return childOfChild;
            }
        }
    }
}

问题是,当我的列表框有太多的项目,如果没有滚动条就无法全部显示时,GetVisualChildren为可见部分之外的项目返回 null。这同样适用于尚未呈现控件的所有项。如何更改此代码以一致地访问列表框项的复选框,而不管该项的呈现状态如何?我尝试过可视化树,逻辑树,FindName,但没有找到解决方案。

获取 UI 中未显示的可视子项

您可以尝试将仅保留可见项目的VirtualizingStackPanel更改为简单的StackPanel作为ItemsPanel。如果性能不是关键,并且不会有很多项目,这应该会有所帮助:

<ListBox>
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
        <StackPanel />
        </ItemsPanelTemplate>
   </ListBox.ItemsPanel>
</ListBox>