2011-08-23 9 views
6

Vorrei accedere alla barra di scorrimento dall'interno del mio ScrollViewer.WPF: Come estrarre la barra di scorrimento da ScrollViewer a livello di programmazione?

Penso che sia nascosto da qualche parte all'interno del modello di ScrollViewer, c'è un modo per me di accedere e ottenere un riferimento ad esso a livello di programmazione?

Quindi, se ho

<ScrollViewer x:Name="myScrollViewer"> 

Nel codice dietro mi piacerebbe andare:

ScrollBar scrollBar = myScrollViewer.GetScrollBar(); 

(ovviamente, suppongo che sarebbe stato più difficile di quanto proprio questo)

risposta

13

penso ho preso ....

myScrollViewer.ApplyTemplate(); 

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

La proprietà modello è di tipo 'ControlTemplate' non contiene i bambini che si possono trovare. – AnthonyWJones

+0

Sì, sì. Funziona, testato in WPF. –

+0

'ApplyTemplate()' deve essere richiamato su 'ScrollViewer' per trovare le barre di scorrimento. Se invochi il codice da questa risposta in 'public override void OnApplyTemplate()' di un controllo che contiene ScrollViewer, non produrrà alcun risultato senza prima chiamare 'myScrollViewer.ApplyTemplate()'. – zmechanic

3

È necessario utilizzare il metodo VisualTreeHelper.GetChild per percorrere l'albero visivo di ScrollViewer per trovare ScrollBar.

Poiché questo metodo fornisce funzionalità di livello molto basso e il suo utilizzo in codice di alto livello sarà doloroso, probabilmente si vorrà utilizzare un wrapper come LINQ to visual tree.

1

ottenere il codice VisualTreeEnumerator da questo blog article.

Con questa classe estensione sul posto: -

ScrollBar s = myScrollViewer.Decendents() 
       .OfType<ScrollBar>() 
       .FirstOrDefault(sb => sb.Name == "PART_VerticalScrollBar"); 
+0

'ApplyTemplate()' deve essere invocato su 'ScrollViewer' per trovare le barre di scorrimento. Se invochi il codice da questa risposta in 'public override void OnApplyTemplate()' di un controllo che contiene ScrollViewer, non produrrà alcun risultato senza prima chiamare 'myScrollViewer.ApplyTemplate()'. – zmechanic

Problemi correlati