简体   繁体   中英

Detect, if ScrollBar of ScrollViewer is visible or not

I have a TreeView. Now, I want to detect, if the vertical Scrollbar is visible or not. When I try it with

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

(where this.ProjectTree is the TreeView) I get always Auto for visibility.

How can I do this to detect, if the ScrollBar is effectiv visible or not?

Thanks.

You can use the ComputedVerticalScrollBarVisibility property. But for that, you first need to find the ScrollViewer in the TreeView 's template. To do that, you can use the following extension method:

    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;
            }
        }
    }

Use it like this:

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

ComputedVerticalScrollBarVisibility instead of VerticalScrollBarVisibility

VerticalScrollBarVisibility sets or gets the behavior , whereas the ComputedVerticalScrollBarVisibility gives you the actual status.

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

You cannot access this property the same way you did in your code example, see Thomas Levesque's answer for that :)

Easiest approach I've found is to simply subscribe to the ScrollChanged event which is part of the attached property ScrollViewer , for example:

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

Codebehind:

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

For some reason IntelliSense didn't show me the event but it works.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM