Обнаруживать, если ScrollBar ScrollViewer виден или нет

У меня есть TreeView. Теперь, я хочу обнаружить, если вертикальная полоса прокрутки видима или нет. Когда я попробую с помощью

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

(где this.ProjectTree - TreeView) Я всегда получаю Auto для видимости.

Как это сделать, чтобы обнаружить, если ScrollBar является видимым или нет?

Спасибо.

Ответ 1

Вы можете использовать свойство 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;

Ответ 2

ComputedVerticalScrollBarVisibility вместо VerticalScrollBarVisibility

VerticalScrollBarVisibility устанавливает или получает поведение, тогда как ComputedVerticalScrollBarVisibility дает вам фактическое состояние.

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

Вы не можете получить доступ к этому свойству так же, как в своем примере кода, см. ответ Томаса Левеска:)

Ответ 3

Самый простой подход, который я нашел, это просто подписаться на событие ScrollChanged, которое является частью присоединенного свойства ScrollViewer, например:

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

По какой-то причине IntelliSense не показывал мне событие, но оно работает.