2011-08-23 15 views
6

私のScrollViewerからScrollbarにアクセスしたいと思います。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

'ApplyTemplate()'はスクロールバーを見つけるために 'ScrollViewer'で呼び出さなければなりません。 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

'ApplyTemplate()'はスクロールバーを見つけるために 'ScrollViewer'で呼び出さなければなりません。 ScrollViewerを含むコントロールの 'public override void OnApplyTemplate()'でこの答えのコードを呼び出すと、 'myScrollViewer.ApplyTemplate()'を先に呼び出さなければ結果は得られません。 – zmechanic

関連する問題