2011-08-23 18 views
6

Me gustaría acceder a la barra de desplazamiento desde mi ScrollViewer.WPF: ¿Cómo extraer Scrollbar From ScrollViewer programmatically?

Creo que está oculto en algún lugar dentro de la plantilla de ScrollViewer, ¿hay alguna manera de acceder y obtener una referencia programática?

Así que si tengo

<ScrollViewer x:Name="myScrollViewer"> 

En el código detrás me gustaría ir:

ScrollBar scrollBar = myScrollViewer.GetScrollBar(); 

(obviamente, supongo que sería más complicado que eso)

Respuesta

13

Creo que lo tengo ....

myScrollViewer.ApplyTemplate(); 

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

La propiedad plantilla es de tipo 'ControlTemplate' que no contiene los niños que se pueden encontrar. – AnthonyWJones

+0

Sí lo hace. Esto funciona, lo probé en WPF. –

+0

'ApplyTemplate()' debe invocarse en 'ScrollViewer' para encontrar barras de desplazamiento. Si invoca el código de esta respuesta en 'anulación pública anulada OnApplyTemplate()' de un control que contiene ScrollViewer, no obtendrá ningún resultado sin llamar 'myScrollViewer.ApplyTemplate()' primero. – zmechanic

3

Tendrá que utilizar el método VisualTreeHelper.GetChild para recorrer el árbol visual de ScrollViewer y encontrar el ScrollBar.

Dado que este método proporciona una funcionalidad de muy bajo nivel y su uso en el código de alto nivel será doloroso, es probable que desee utilizar un contenedor como LINQ to visual tree.

1

obtener el código VisualTreeEnumeratorarticle desde este blog.

Con esta clase de extensión en su lugar: -

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

'ApplyTemplate()' debe invocarse en 'ScrollViewer' para encontrar barras de desplazamiento. Si invoca el código de esta respuesta en 'anulación pública anulada OnApplyTemplate()' de un control que contiene ScrollViewer, no obtendrá ningún resultado sin llamar 'myScrollViewer.ApplyTemplate()' primero. – zmechanic

Cuestiones relacionadas