2012-09-03 21 views
9

Quiero que la ventana respete MinWidth/MinHeight y MaxWidth/MaxHeight especificaciones del control de contenido en el interior.Limitaciones de tamaño de ventana por contenido

Algunos sugirieron usar SizeToContent, pero esto solo ayuda a establecer el tamaño de la ventana inicial, no las restricciones.

Otros sugirieron reemplazar MeasureOverride y establecer la ventana de Min/Max altura y ancho allí, pero esto parece ser algo sucio, teniendo en cuenta que un problema tan trivial seguramente debería tener una solución puramente declarativa.

sólo por mencionar otra solución que parece razonable, pero no trabajo (y habían sido anteriormente mencionada en una respuesta que se borraron): unión MinWidth de la ventana para MinWidth del control no tiene en decoración de las ventanas cuenta.

Respuesta

7

Si el tamaño de la ventana inicial está configurado para que el contenido real no sea forzado por MinWidth/MinHeight y MaxWidth/MaxHeight en la pasada de diseño inicial (por ejemplo, usando Window.SizeToContent = "WidthAndHeight"), entonces ecuaciones siguientes son verdaderas:

Window.ActualSize - Content.ActualSize = 
     Window.MinSize - Content.MinSize = Window.MaxSize - Content.MaxSize. 

sobre la base de estas ecuaciones se puede derivar el siguiente código:

public MainWindow() 
{ 
    InitializeComponent(); 

    this.SizeChanged += OnWindowSizeChanged; 
} 

private static void OnWindowSizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    var window = (Window)sender; 
    var content = (FrameworkElement)window.Content; 

    window.MinWidth = window.ActualWidth - content.ActualWidth + content.MinWidth; 
    window.MaxWidth = window.ActualWidth - content.ActualWidth + content.MaxWidth; 

    window.MinHeight = window.ActualHeight - content.ActualHeight + content.MinHeight; 
    window.MaxHeight = window.ActualHeight - content.ActualHeight + content.MaxHeight; 

    window.SizeChanged -= OnWindowSizeChanged; 
} 

no sé cómo lograr esto de manera eficiente utilizando el enfoque declarativa pura ya que el código debe ser corrió solo una vez después de la ini pase de diseño final.

+0

¿Sabe si se activará SizeChanged en caso de que se modifique MinWidth/MinHeight o MaxWidth/MaxHeight of Content? ¿O debería adjuntar un enlace a esas propiedades por separado? – EFraim

+0

Esto es definitivamente útil, actualmente estoy comprobando si resuelve mi problema por completo. – EFraim

1

Use la extensión de marcado de encuadernación. Un enlace es la forma de wpf de decir cuándo esta propiedad (fuente) cambia la actualización de alguna otra propiedad (destino). En este caso, la propiedad MinWidth de la Grilla es la Fuente y la propiedad MinWidth de su ventana es el objetivo.

<Window x:Class="MinMaxValuesOnWindows.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="600" Width="800" 
    MinWidth="{Binding ElementName=gridy, Path=MinWidth}" 
    MinHeight="{Binding ElementName=gridy, Path=MinHeight}" 
    MaxWidth="{Binding ElementName=gridy, Path=MaxWidth}" 
    MaxHeight="{Binding ElementName=gridy, Path=MaxHeight}"> 
    <Grid Name="gridy" MinHeight="80" MinWidth="80" MaxHeight="300" MaxWidth="300"/> 
</Window> 

Como usted ha mencionado en el tema esto no funciona por completo, pero se puede utilizar un convertidor en la unión de añadir en la altura y el ancho del marco de la ventana antes de actualizar el destino de enlace (que podría requerir una PInvoke). Como dudo que el grosor del marco de la ventana cambie dinámicamente en su aplicación, esto probablemente solo sea un valor constante (no necesariamente cierto si el usuario cambia de tema).

+0

Lo que dices es técnicamente cierto, pero como he señalado en la pregunta, la principal dificultad que enfrento es averiguar las dimensiones de la decoración de forma independiente del tema. La otra respuesta resuelve esta parte del rompecabezas, por lo tanto lo aceptaré. – EFraim

5

Algunos sugirieron usar SizeToContent, pero esto solo ayuda a establecer el tamaño de la ventana inicial, no las restricciones.

trabajé en torno a esta estableciendo las propiedades MinWidth y MinHeightjusto después de las ventanas se inicializan:

MainWindow.xaml

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

MainWindow.xaml.cs

public MainWindow() 
{ 
    InitializeComponent(); 
    SourceInitialized += (s, e) => 
    { 
     MinWidth = ActualWidth; 
     MinHeight = ActualHeight; 
    }; 
} 
+0

Esta debería ser la respuesta aceptada. – user2481095

Cuestiones relacionadas