获取 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,但没有找到解决方案。
您可以尝试将仅保留可见项目的VirtualizingStackPanel更改为简单的StackPanel作为ItemsPanel。如果性能不是关键,并且不会有很多项目,这应该会有所帮助:
<ListBox>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>