我有一个TreeView。现在,我想检测,如果垂直滚动条是否可见。 当我尝试
var visibility = this.ProjectTree.GetValue(ScrollViewer.VerticalScrollBarVisibilityProperty)
(其中this.ProjectTree是TreeView) 我总是获得Auto以获得可见性。
如果ScrollBar有效可见,我该如何检测?
感谢。
答案 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则为您提供实际状态。
您无法像在代码示例中那样访问此属性,请参阅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不会向我显示事件,但是它可以工作。