Обнаруживать, если 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 не показывал мне событие, но оно работает.