2011-08-23 62 views
6

我想从我的ScrollViewer中访问滚动条。WPF:如何以编程方式从ScrollViewer中提取滚动条?

我认为它隐藏在ScrollViewer模板的某个地方,有没有办法让我访问,并以编程方式获得对它的引用?

所以,如果我有

<ScrollViewer x:Name="myScrollViewer"> 

在后面的代码我想去:

ScrollBar scrollBar = myScrollViewer.GetScrollBar(); 

(很明显,我认为这将会是远远不止这些棘手)

回答

13

我想我明白了....

myScrollViewer.ApplyTemplate(); 

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

模板属性的类型的'ControlTemplate'它不包含的孩子,你可以找到。 – AnthonyWJones

+0

是的。这工作,在WPF中测试它。 –

+0

必须在'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"); 
+0

必须在'ScrollViewer'上调用'ApplyTemplate()'来查找滚动条。如果您在包含ScrollViewer的控件的'public override void OnApplyTemplate()'中调用此答案中的代码,它将不会在未先调用myScrollViewer.ApplyTemplate()的情况下产生任何结果。 – zmechanic

相关问题