WPF:如何通过编程方式提取ScrollViewer中的滚动条?

7

我希望能够从我的 ScrollViewer 中访问滚动条。

我认为它隐藏在 ScrollViewer 的模板中,有没有办法通过编程方式访问并获取对其的引用?

所以如果我有:

<ScrollViewer x:Name="myScrollViewer">

在代码后台,我想要这样做:
ScrollBar scrollBar = myScrollViewer.GetScrollBar();

(显然,我认为这不会像那样简单)

这应该很简单,但由于某些未知的原因,开发人员决定把它搞得过于复杂化了。如果这里有人能解释一下为什么他们这样做,请告诉我! - Paul McCarthy
3个回答

14

我想我明白了......

myScrollViewer.ApplyTemplate();

ScrollBar s = myScrollViewer.Template.FindName("PART_VerticalScrollBar", myScrollViewer) as ScrollBar;

模板属性的类型为ControlTemplate,它不包含可以查找的子元素。 - AnthonyWJones
1
必须在ScrollViewer上调用ApplyTemplate()才能找到滚动条。如果您将此答案中的代码从包含ScrollViewer的控件的public override void OnApplyTemplate()中调用,则不会产生任何结果,除非首先调用myScrollViewer.ApplyTemplate() - zmechanic

3
你需要使用VisualTreeHelper.GetChild方法遍历ScrollViewer的可视树来查找ScrollBar
由于该方法提供了非常低级别的功能,因此在高级代码中使用它将非常痛苦,您可能希望利用类似LINQ to visual tree的包装器。

1
从这篇博客 article 获取VisualTreeEnumerator代码。
有了这个扩展类:-
ScrollBar s = myScrollViewer.Decendents()
                 .OfType<ScrollBar>()
                 .FirstOrDefault(sb => sb.Name == "PART_VerticalScrollBar");

必须在 ScrollViewer 上调用 ApplyTemplate() 才能找到滚动条。如果您在包含 ScrollViewer 的控件的 public override void OnApplyTemplate() 中调用此答案中的代码,而没有先调用 myScrollViewer.ApplyTemplate(),则不会产生任何结果。 - zmechanic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接