2011-04-14 10 views
14

Tengo un scrollviewer que contiene un panel de elementos de textblock (en realidad, estos son tabitems, estoy usando un panel de distribución dentro de un scrollviewer para anular el tabpanel predeterminado en una plantilla de tabcontrol). Lo que me gustaría poder hacer es, cuando se cambie la pestaña seleccionada, mover la pestaña recién seleccionada al centro del área visible del visualizador de desplazamiento. Idealmente, esto funcionaría para todas las pestañas, incluso las de los lados lejanos, pero me conformaría con poder decirle al scrollviewer que se desplace de manera que un elemento en particular esté lo más cerca posible del centro.WPF: ¿centrando contenido en un scrollviewer?

¿Hay alguna manera obvia de lograr esto en WPF? Todas las soluciones en las que puedo pensar ahora implican mucho trabajo en controles personalizados.

enter image description here

+0

pantalla para ayudar con la explicación: [http://img20.imageshack.us/i/tabscreenshot.png/](http://img20. imageshack.us/i/tabscreenshot.png/) –

+2

@Robert Levy: No es así como debe hacerse, si ninguna respuesta responde una pregunta, no hay necesidad de aceptar ninguna de ellas. –

Respuesta

7

ScrollViewer.ScrollToHorizontalOffset() es lo que busca. Solo necesita calcular cuál es el desplazamiento del elemento seleccionado en relación con el panel de distribución. Puede hacer eso con algo como selectedElement.TranslatePoint(new Point(), stackPanel)

Para hacer que esto funcione para elementos en los extremos, necesitará agregar algunos elementos 'en blanco' al comienzo y al final de su desplazador de desplazamiento para ocupar la cantidad apropiada de espacio .

Para hacer esto se vea bonito, llame ScrollToHorizontalOffset en un temporizador para que el 'animado' desplazamiento en lugar de salto

12

podrá ajustar fácilmente el contenido en el centro mediante el siguiente código;

scrollviewer.ScrollToVerticalOffset(scrollviewer.ScrollableHeight/2); 
scrollviewer.ScrollToHorizontalOffset(scrollviewer.ScrollableWidth/2); 
+0

Gracias por este consejo. Soy un patrón MVVM y necesito mantener una imagen centrada al hacer zoom. Simplemente utilicé un comando en mi evento ScrollChanged y pasé mi scrollviewer como parámetro al comando. Desde allí, pude mantener mi centro de contenido de mi ViewModel. Aunque parece un poco hackeo. Probablemente eventualmente crearé un scrollviewer personalizado que nos permitirá hacer esto a través de propiedades de dependencia. – KyleLib

0

Esto funcionó para mí:

//for ScrollViewer s; 
s.ScrollToHorizontalOffset((s.ExtentWidth - s.ViewportWidth)/2); 
s.ScrollToVerticalOffset((s.ExtentHeight - s.ViewportHeight)/2); 
Cuestiones relacionadas