检测 ScrollViewer 的滚动条是否可见



我有一个树视图。现在,我想检测垂直滚动条是否可见。当我尝试使用

var visibility = this.ProjectTree.GetValue(ScrollViewer.VerticalScrollBarVisibilityProperty)

(哪里这个。项目树是树视图)我总是自动获得可见性。

如何执行此操作以检测滚动条是否有效可见?

谢谢。

可以使用

ComputedVerticalScrollBarVisibility 属性。但为此,您首先需要在 TreeView 的模板中找到ScrollViewer。为此,您可以使用以下扩展方法:

    public static IEnumerable<DependencyObject> GetDescendants(this DependencyObject obj)
    {
        foreach (var child in obj.GetChildren())
        {
            yield return child;
            foreach (var descendant in child.GetDescendants())
            {
                yield return descendant;
            }
        }
    }

像这样使用它:

var scrollViewer = ProjectTree.GetDescendants().OfType<ScrollViewer>().First();
var visibility = scrollViewer.ComputedVerticalScrollBarVisibility;

ComputedVerticalScrollBarVisibility 而不是 VerticalScrollBarVisibility

VerticalScrollBarVisibility设置或获取行为,而ComputedVerticalScrollBarVisibility为您提供实际状态。

http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollviewer.computedverticalscrollbarvisibility(v=vs.110).aspx

您不能像在代码示例中那样访问此属性,请参阅 Thomas Levesque 对该:)的回答

我发现的最简单的方法是简单地订阅 ScrollChanged 事件,该事件是附加属性ScrollViewer的一部分,例如:

<TreeView ScrollViewer.ScrollChanged="TreeView_OnScrollChanged">
</TreeView>

代码隐藏:

private void TreeView_OnScrollChanged(object sender, ScrollChangedEventArgs e)
{
    if (e.OriginalSource is ScrollViewer sv)
    {
        Debug.WriteLine(sv.ComputedVerticalScrollBarVisibility);
    }
}

出于某种原因,IntelliSense没有向我展示该事件,但它有效。

最新更新