2011-12-11 6 views
6

En WPF, tengo un scrollviewer con 7 grupos de grupos diferentes en él. Cada grupo de grupo es su propia sección individual para diferentes formas. Debido a que el scrollviewer es tan largo, he colocado una serie de botones en un panel de pila en el lado izquierdo del panel, y he completado el código para que al hacer clic en un botón se active el método BringIntoView para el correspondiente groupbox.BringIntoView Método

Mi pregunta es, ¿hay alguna manera de obligar a BringIntoView a colocar el grupo en la parte superior de la sección visible cada vez. De forma predeterminada, BringIntoView solo mueve el scrollviewer hasta que todo el grupo se encuentre dentro de la vista, no para que sea el elemento superior que se muestra. ¿Hay alguna forma de evitar esto?

Intenté usar ScrollToVerticalOffset, pero no pude encontrar la manera de obtener la posición correcta, principalmente porque dice que groupbox no tiene la propiedad Locate, que iba a usar para obtener la posición, luego lo configuré con ScrollToVerticalOffset . Una cosa en la que pensé mientras escribía esto fue hacer que cada botón presionara jusmp primero en el grupo de grupo superior, luego continuara inmediatamente con el correcto, pero esto parece una especie de hack-ish, y prefiero encontrar el camino correcto. :)

+1

Solo un consejo, qué tal un poco menos de código y dividir el primer párrafo en párrafos más pequeños y más digeribles. De lo contrario, solo tenemos una pared de texto y una pared de código que no atraerá mucha atención y que alejará a la gente. Lea la excelente publicación de Jon Skeets sobre cómo hacer la pregunta perfecta aquí: http://msmvps.com/blogs/jon_skeet/archive/2010/08/29/writing-the-perfect-question.aspx – Kev

+0

+1 para edición y mejora de la pregunta – SvenG

Respuesta

9

prueba este:

private void ScrollToGroupBox(GroupBox groupBox) 
{ 
    GeneralTransform groupBoxTransform = groupBox.TransformToAncestor(scrollViewer); 
    Rect rectangle = groupBoxTransform.TransformBounds(new Rect(new Point(0, 0), groupBox.RenderSize)); 
    scrollViewer.ScrollToVerticalOffset(rectangle.Top + scrollViewer.VerticalOffset); 
} 

El código obtiene la posición de su GroupBox dentro del ScrollViewer y se desplaza a la misma.

+1

¡Funciona muy bien! Ahora mi único problema es dejar espacio suficiente en la parte inferior para permitir que el GroupBox final llegue a la cima antes de que se agote el espacio. Hice esto agregando un margen al final del último GroupBox, pero si sabes de una mejor manera, me encantaría escucharlo. Funciona como lo tengo, pero si cambio el tamaño de la ventana para que sea más alto, no alcanza. –

+1

Me alegro de poder ayudar. No sé de una mejor manera que agregar un Margen o establecer la altura de la casilla de grupo al mismo valor que el visualizador de desplazamiento. Puede hacer esto vinculando la altura del último cuadro de grupo en el scrollviewer siguiendo el código xaml: SvenG

Cuestiones relacionadas