2011-07-15 7 views

Respuesta

11

Puede hacer que las filas cambien de tamaño, pero GridSplitter en sí mismo es un pulgar y tiene sus propios eventos como DragStarted y DragCompleted. Más detalles here.

Editar: Si hace que el GridSplitter se pueda enfocar y permita que se mueva con el teclado, lea la respuesta de Benlitz para obtener más información.

+0

Léelo aunque no se preocupe por el teclado, ya que es un error de diseño común manejar el evento incorrecto (una de las acciones de entrada, en lugar del resultado general de la acción) – Benlitz

+0

Luego elabore :) I Es curioso por qué preferiría un método no extensible basado en un solo tipo de acción del usuario, sobre manejar el cambio de propiedad adecuado, mientras que ambos tienen aproximadamente el mismo costo de implementación. Supongamos que después de implementar esto, se le pide que agregue un botón que restaure el tamaño de fila predeterminado. No se manejaría cambiar el tamaño programáticamente. Es por eso que creo que este enfoque no es bueno; puede introducir fácilmente errores maliciosos en su UI. Si la operación que realiza en el controlador del cambio de tamaño de fila no es claramente visible, es posible que ni siquiera advierta el problema durante semanas. – Benlitz

+0

Como ejemplo, reaccionar a un dedo DragDelta en lugar de un cambio de tamaño tiene un efecto de animación muy diferente: verifique con Snoop y vea los diferentes mensajes y cuán granulares son. Finalmente, siempre que el teclado no se pueda usar para cambiar el tamaño del GridSplitter (enfocable = falso), de todos modos es un punto discutible. –

6

No probé, pero estoy bastante seguro de que la respuesta actualmente aceptada de AresAvatar no funcionará si está cambiando el tamaño de las filas/columnas con las flechas del teclado (enfocando el divisor de la cuadrícula). Este es un caso raro pero posible que debe anticipar en su aplicación.

Cuando se mueve el divisor de cuadrícula (ya sea por arrastrar y soltar o utilizando las flechas del teclado), cambia los Width/Height propiedades de dependencia de la ColumnDefinition/RowDefinition de la cuadrícula. Le sea fácil registrar un manejador en este cambio de propiedad:

var heightDescriptor = DependencyPropertyDescriptor.FromProperty(RowDefinition.HeightProperty, typeof(ItemsControl)); 
heightDescriptor.AddValueChanged(myGrid.RowDefinition[0], HeightChanged); 

(Este fragmento de voluntad para la pista instancia cambio de tamaño en la primera fila de la parrilla).

Luego puede manejar el cambio de tamaño en un controlador que funcionará en todos los casos.

private void HeightChanged(object sender, EventArgs e) 
{ 
    // TODO: handle row resize 
} 

En general, se aconseja realmente no confiar en la acción de entrada del usuario (arrastre del ratón, entradas de teclado ...) para manejar un OR lógico visuales acciones/eventos, ya que casi siempre hay varias formas de hacerlo las mismas acciones usando diferentes entradas (mouse, teclados, pantalla táctil, herramientas de fácil uso ...).

+0

Hola @Benlitz, esta respuesta no tiene mucho sentido. Si permite que GridSplitter enfoque el teclado, funciona como se supone que debe hacerlo. –

+0

Tiene perfecto sentido. Si desea manejar el evento "El divisor de cuadrícula se mueve" (pregunta OP), NO debe manejar DragStarted/Completed, ya que supondría que arrastrar el mouse es la única forma de mover el divisor, lo cual es incorrecto. El enfoque en sí es incorrecto, porque manejas una de las causas posibles (arrastrando), en lugar de manejar la consecuencia (el divisor se ha movido). La ilustración que di para probar mi punto es que mover el divisor usando las flechas del teclado no disparará los eventos de arrastre (lo probé ahora). – Benlitz

+0

OK, entiendo su respuesta mejor ahora con su comentario. Si hace que el GridSplitter sea enfocable y permite el movimiento del teclado, no genera eventos de arrastre. He agregado una nota a mi respuesta para leer la tuya. –

Cuestiones relacionadas