2011-08-23 58 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