XAML TreeViewItem IsVisible属性始终为真

pftdvrlh  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(126)

我的应用程序中有一个填充的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个节点在诊断输出中都打印为“可见”。
有什么想法吗?

oo7oh9g9

oo7oh9g91#

就可见性而言,任何UIElement(例如,TreeViewItem)中都有2个属性,它们是:

  1. Visibility Visibility {set; get;},可以设置为“可见”、“折叠”或“隐藏”。
  2. bool IsVisible {get;},它是只读的,不能设置。如果可见性为可见,则返回true,如果可见性为隐藏或折叠,则返回false。
    Visibility属性的setter中,将触发OnVisibilityChanged方法[见源代码],并在那里设置一个私有属性VisibilityCache。然后,当调用IsVisible时,它将根据VisibilityCache值返回true/false [见源代码]。
    因此,IsVisible表示模式Visibility,这意味着“在呈现时此UIElement是否可见?",而不是“此UIElement是否立即被用户看到?”
    P.S.要检查用户是否看到UIElement,请检查this thread

相关问题