C# 检测ScrollViewer的滚动条是否可见

C# 检测ScrollViewer的滚动条是否可见,c#,wpf,scrollviewer,C#,Wpf,Scrollviewer,我有一个树景。现在,我想检测垂直滚动条是否可见。 当我试着用它的时候 var visibility = this.ProjectTree.GetValue(ScrollViewer.VerticalScrollBarVisibilityProperty) (其中this.ProjectTree是树视图) 我总是能自动看到 如何检测滚动条是否可见 谢谢。计算垂直滚动条可见性,而不是垂直滚动条可见性 VerticalScrollBarVisibility设置或获取行为,而ComputedVerti

我有一个树景。现在,我想检测垂直滚动条是否可见。 当我试着用它的时候

var visibility = this.ProjectTree.GetValue(ScrollViewer.VerticalScrollBarVisibilityProperty)
(其中this.ProjectTree是树视图) 我总是能自动看到

如何检测滚动条是否可见


谢谢。

计算垂直滚动条可见性,而不是垂直滚动条可见性

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


您不能像在代码示例中那样访问此属性,请参见Thomas Levesque的答案:)

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

    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;
            }
        }
    }
公共静态IEnumerable GetDescents(此DependencyObject对象)
{
foreach(obj.GetChildren()中的变量child)
{
退换子女;
foreach(child.getDescents()中的var后代)
{
产量回报后代;
}
}
}
像这样使用它:

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

我发现的最简单的方法是订阅
ScrollChanged
事件,它是附加属性
ScrollViewer
的一部分,例如:

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

出于某种原因,IntelliSense没有向我显示该事件,但它可以正常工作。

是的,但它是ScrollViewer的属性,而不是TreeView,因此您需要首先在模板中找到ScrollViewer。我假设如果OP中的代码返回结果,那么它成功地解决了ScrollViewer allready问题,只是错误的属性…不,因为ScrollViewer.VerticalScrollBarVisibility是一个附加属性,它是在TreeView而不是ScrollViewer上设置的。出于好奇,为什么需要这样做?在大多数情况下,我看到有人这样做,这是解决其他问题的次优方式。@MikeStrobel问题是无限的。数一数没有意义你能给这个属性附加一个属性更改事件吗?@malthe,我不认为这有什么特别的事件,但是因为它是一个依赖属性,您始终可以使用
DependencyPropertyDescriptor.AddValueChanged
查看它。请注意,如果您试图在Scrollviewer上使用ComputedVerticalScrollBarVisibility,请确保在xaml中使用VerticalScrollBarVisibility=“Auto”
private void TreeView_OnScrollChanged(object sender, ScrollChangedEventArgs e)
{
    if (e.OriginalSource is ScrollViewer sv)
    {
        Debug.WriteLine(sv.ComputedVerticalScrollBarVisibility);
    }
}