【问题标题】:Detect, if ScrollBar of ScrollViewer is visible or not检测 ScrollViewer 的 ScrollBar 是否可见
【发布时间】:2013-11-18 12:59:38
【问题描述】:

我有一个 TreeView。现在,我想检测垂直滚动条是否可见。 当我尝试使用

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

(this.ProjectTree 是 TreeView) 我总是自动获得可见性。

如何检测滚动条是否有效可见?

谢谢。

【问题讨论】:

  • 出于好奇,您为什么需要这样做?在我看到有人这样做的大多数情况下,这是解决其他问题的次优方法。
  • @MikeStrobel 问题无穷无尽。数他们没有意义

标签: c# wpf scrollviewer


【解决方案1】:

ComputedVerticalScrollBarVisibility 而不是 VerticalScrollBarVisibility

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

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

您无法像在代码示例中那样访问此属性,请参阅 Thomas Levesque 的回答 :)

【讨论】:

  • 可以,但它是ScrollViewer的属性,不是TreeView,所以需要先在模板中找到ScrollViewer。
  • 我假设如果 OP 中的代码返回结果,那么它已经成功地处理了 ScrollViewer,只是属性错误......
  • 否,因为 ScrollViewer.VerticalScrollBarVisibility 是一个附加属性,它是在 TreeView 上设置的,而不是在 ScrollViewer 上。
【解决方案2】:

您可以使用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;
            }
        }
    }

像这样使用它:

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

【讨论】:

  • 您能否将属性更改事件附加到此属性?
  • @malthe,我不认为有特定的事件,但由于它是一个依赖属性,你可以随时使用DependencyPropertyDescriptor.AddValueChanged
  • 请注意,如果您尝试在 Scrollviewer 上使用 ComputedVerticalScrollBarVisibility,请确保在 xaml 中使用 VerticalScrollBarVisibility="Auto"
【解决方案3】:

我发现的最简单的方法是简单地订阅 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 没有向我显示该事件,但它有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多