2010-08-31 10 views
7

Tengo una ventana WPF con panel expansible (a través de Expander). El panel está en el lado izquierdo de la ventana, y cuando se expande, la ventana crece para ajustarse al contenido.WPF - Expanda ventana a la izquierda

De forma predeterminada, las ventanas están ancladas a la esquina superior izquierda, por lo que mi ventana crece hacia la derecha. Me gustaría que la ventana crezca hacia la izquierda.

he tratado de hacer lo siguiente en el evento Window.SizeChanged:

private void onWindowSizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    Left -= (e.NewSize.Width - e.PreviousSize.Width) 
} 

y funciona, pero el crecimiento es desigual, y me gustaría encontrar una solución más suave.

+0

Estoy jugando con su solución actual, y también parece tener problemas. Si cambia el tamaño con el control de la ventana (es decir, no usa el expansor), entonces el cambio de tamaño es realmente irregular. Por mi parte, el hecho de cambiar el tamaño de la ventana también rompe el código de redimensionamiento de la ventana y ya no se expandirá hacia la izquierda. – Dave

Respuesta

4

que lograron superar esta usando una solución sencilla: Ocultar Mostrar &.

Aquí está el código:

protected override void OnRenderSizeChanged(SizeChangeInfo sizeInfo) 
{ 
    if (!sizeInfo.WidthChanged) 
    { 
     base.OnRenderSizeChanged(sizeInfo); 
     return; 
    } 
    Hide(); 
    base.OnRenderSizeChanged(sizeInfo); 
    Left -= (sizeInfo.NewSize.Width - sizeInfo.PreviousSize.Width); 
    Show(); 
} 

que sustituyó al controlador de eventos para Window.SizeChanged con esta anulación de FrameworkElement.OnRenderSizeChanged.

0

Puede poner su expansor en una cuadrícula (donde el tamaño de la columna puede cambiar) y luego establecer la propiedad ExpandDirection de su expansor a la izquierda?

+0

Quiero que * Window * crezca hacia la izquierda. El expansor está creciendo a la izquierda, pero las ventanas se redimensionan para ajustarse al contenido a la derecha (para que todo se mueva). –

1

Solución 1

Trate de utilizar la propiedad Ventana: SizeToContent = "ancho" esto va a escalar su ventana al tamaño de su contenido y se puede ampliar o reducir el contenido utilizando la animación y relajación, esto hará que el escalado de la ventana agradable y suave.

Solución 2

Se puede crear una ventana que es más grande que su contenido y hacer que su fondo transparente. Aún debe agregar el fondo a algún elemento.

Aquí es un ejemplo de cómo puede verse como: example image

+0

La solución 1 seguirá causando que la ventana cambie de tamaño a la izquierda, ¿no? Y la Solución 2 es agradable, pero no podré usar una ventana normal con la barra de título. Tendré que imitar eso yo mismo. –

2

no he tratado de hacer crecer una ventana a la izquierda como lo que estás pidiendo, pero si todo lo demás falla, consideraría la plantilla de un botón para que se vea como el botón de expansión. Luego, en lugar de tratar de hacer que su Ventana crezca hacia la izquierda, haga que una nueva Ventana crezca a la izquierda de su Ventana principal usando Transformaciones.

ACTUALIZACIÓN

Bueno, el pobre rendimiento de la representación podría ser la tarjeta de vídeo relacionados, el diseño (demasiado complejo) relacionados, o ambos. Tengo una idea que podría hacer el truco para ti. Jeff Prosise escribió en su blog sobre una lupa en Silverlight que usa un WriteableBitmap para lograr el efecto deseado. Pensé: "¿por qué no utilizar un WriteableBitmap para crear una captura de pantalla de su diseño a la derecha del expansor y cubrir los otros elementos con él?". Creo que si haces esto y ocultas los elementos subyacentes (para que no se ajusten), el rendimiento de la representación mejorará mucho.

Obtuve el código de Jeff para trabajar en WPF con pequeñas modificaciones.

http://www.wintellect.com/CS/blogs/jprosise/archive/2009/10/29/more-fun-with-silverlight-3-s-writeablebitmap.aspx

+0

No pude entender su sugerencia. ¿Puedes por favor elaborar? –

+0

@Omer bien, * si * Entiendo tu situación correctamente, tienes un expansor que se abre hacia la izquierda. Pero cuando haces esto, la ventana cambia de tamaño a la derecha y todo el contenido cambia, lo que supongo que se ve un poco agitado para ti. Si mantiene toda la ventana * intacta *, nunca tendrá que cambiar el tamaño de sus hijos. Puede falsificar este efecto utilizando un botón que se parece a un expansor, pero cuando hace clic en él, el controlador puede crear una ventana completamente separada a la izquierda de la ventana principal, lo que evitaría el problema de cambio de tamaño completo. Y puedes hacerlo animado. – Dave

+0

Ok, lo entiendo, pero este es un truco con un efecto secundario: el resultado final no se verá como una sola ventana (con una sola barra de título). Estoy buscando una solución que me brinde una única ventana. –

Cuestiones relacionadas