2011-03-08 11 views
6

Tengo una ventana WPF que contiene un UserControl con MinWidth y MinHeight. ¿Cómo puedo evitar que el usuario cambie el tamaño de la ventana hasta un punto donde se viola el tamaño mínimo de ese UserControl?WPF: Hacer que los elementos secundarios MinWidth/MinHeight restrinjan la ventana

Aquí hay una versión simplificada de una ventana en la que estoy trabajando. Mi verdadero control de usuario de la aplicación se sustituye aquí por un borde:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <DockPanel> 
    <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal"> 
     <Button Content="OK"/> 
     <Button Content="Cancel"/> 
    </StackPanel> 
    <Border BorderBrush="Green" BorderThickness="10" 
      MinWidth="200" MinHeight="150"/> 
    </DockPanel> 
</Window> 

Si reducir la ventana lo suficientemente pequeño, el derecho de la Frontera e inferior se cortan. Quiero evitar que la ventana se vuelva tan pequeña: quiero que el tamaño mínimo de mi ventana sea exactamente el punto en el que el borde está en su tamaño mínimo. Algunos marcos (como el Delphi VCL) agregan automáticamente los tamaños mínimos de los controles secundarios hasta la ventana; Esperaba que WPF hiciera lo mismo, pero claramente no es así.

Siempre podría establecer explícitamente MinWidth y MinHeight de la ventana, pero para calcularlos correctamente, tendría que tener en cuenta ButtonHealHeight, lo que significaría esperar al menos un pase de diseño (o llamar a Measure manualmente). Sucio.

¿Hay alguna manera mejor de evitar que la ventana se vuelva demasiado pequeña para su contenido?

Respuesta

5

La forma más sencilla que he encontrado es decir la ventana al tamaño de su contenido:

<Window ... SizeToContent="WidthAndHeight" ...> 

y luego, una vez que se hace de tamaño (que se llevará a MinWidth y MinHeight los elementos secundarios en cuenta) , ejecute algún código que establezca MinWidth y MinHeight en ActualWidth y ActualHeight de la ventana. También es una buena idea desactivar SizeToContent en este punto, para que la ventana no cambie de tamaño cuando cambie su contenido.

La siguiente pregunta es, ¿dónde poner este código? finalmente me decidí por OnSourceInitialized:

protected override void OnSourceInitialized(EventArgs e) 
{ 
    base.OnSourceInitialized(e); 
    MinWidth = ActualWidth; 
    MinHeight = ActualHeight; 
    ClearValue(SizeToContentProperty); 
} 

También probé el evento Loaded, pero en mi caso, que era demasiado pronto - Cargado ocurre antes han sido evaluadas DataBindings, y tuve DataBindings que afectaron mi diseño (una etiqueta con un enlace para su contenido: su tamaño cambió después de que la vinculación entró en vigor). Al mover el código a OnSourceInitialized, que se activa después de la unión de datos, se corrigió el problema.

(También hubo otros eventos que se desencadenaron después del enlace, pero antes se mostraba la ventana SizeChanged y LayoutUpdated, pero ambos se disparan varias veces a medida que se muestra la ventana, y más tarde si el usuario cambia el tamaño de la ventana; OnSourceInitialized solo se dispara una vez, lo cual considero ideal.)

+0

Esto funciona perfectamente. –

0

¿Ha intentado utilizar un enlace de estilo de ElementName desde la ventana al UserControl en cuestión? Parece que sería factible vincular MinWidth/Height de la ventana a los del botón. Todavía no es bonito, pero no debería requerir pases adicionales una vez que el enlace está en su lugar y se adaptará si cambia los valores en el botón.

+0

Idea interesante, aunque el MinHeight de la ventana debería basarse en MinHeight + UserControl + ActualHeight del botón + el alto de los bordes de la ventana y el título. Así que probablemente necesitaría un MultiBinding y un IMultiValueConverter personalizado para hacerlo. ¿Eso es lo que tenías en mente? –

Cuestiones relacionadas