我的应用程序中有一个填充的TreeView控件(在XAML中)。在TreeView中可以查看更多的节点,因此它显示滚动条以允许垂直滚动。但是,当我以编程方式在代码隐藏中请求单个TreeViewItems的IsVisible属性时,所有这些属性都返回True,而不管它们实际上是否可见。
XAML文件:
<Grid Margin="10">
<Grid.DataContext>
<local:NodeViewModel/>
</Grid.DataContext>
<TreeView Name="filterTree" ItemsSource="{Binding Path=NodeList, Mode=OneWay }" />
</Grid>
视图模型:
class NodeViewModel
{
public ObservableCollection<string> NodeList { get; private set; }
public NodeViewModel()
{
NodeList = new ObservableCollection<string>();
for ( int i = 0; i < 25; i++ ) {
NodeList.Add($"{i}");
}
}
}
程式码后置:
private void Window_ContentRendered(object sender, System.EventArgs e)
{
foreach ( string node in filterTree.Items ) {
TreeViewItem item = filterTree.ItemContainerGenerator.ContainerFromItem(node) as TreeViewItem;
System.Diagnostics.Debug.WriteLine($"Node {node} is {(item.IsVisible ? "visible" : "hidden")}");
}
}
尽管窗口的大小仅足以显示前10个节点,但集合中的所有25个节点在诊断输出中都打印为“可见”。
有什么想法吗?
1条答案
按热度按时间oo7oh9g91#
就可见性而言,任何
UIElement
(例如,TreeViewItem)中都有2个属性,它们是:Visibility Visibility {set; get;}
,可以设置为“可见”、“折叠”或“隐藏”。bool IsVisible {get;}
,它是只读的,不能设置。如果可见性为可见,则返回true,如果可见性为隐藏或折叠,则返回false。在
Visibility
属性的setter中,将触发OnVisibilityChanged
方法[见源代码],并在那里设置一个私有属性VisibilityCache
。然后,当调用IsVisible
时,它将根据VisibilityCache
值返回true/false [见源代码]。因此,
IsVisible
表示模式Visibility
,这意味着“在呈现时此UIElement是否可见?",而不是“此UIElement是否立即被用户看到?”P.S.要检查用户是否看到UIElement,请检查this thread。