检测,如果ScrollViewer的ScrollBar可见或不可见

时间:2013-11-18 12:59:39

标签: c# wpf scrollviewer

我有一个TreeView。现在,我想检测,如果垂直滚动条是否可见。 当我尝试

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

(其中this.ProjectTree是TreeView) 我总是获得Auto以获得可见性。

如果ScrollBar有效可见,我该如何检测?

感谢。

3 个答案:

答案 0 :(得分:16)

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

    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;

答案 1 :(得分:2)

ComputedVerticalScrollBarVisibility而不是VerticalScrollBarVisibility

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

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

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

答案 2 :(得分:0)

我找到的最简单的方法是简单地订阅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不会向我显示事件,但是它可以工作。