2010-06-23 9 views

Respuesta

22

Si establece los MinHeight y MaxHeight atributos de la ventana a la altura deseada de la ventana tendrá una altura fija

+0

Funciona bien ... tan obvio cuando lo piensas. Gracias –

+9

Desafortunadamente incompatible con el cálculo automático de altura basado en el tamaño del contenido. –

3

Es un poco doloroso. Básicamente, debe configurar una función de enlace para procesar los mensajes de Windows. A continuación, verás el mensaje WM_SIZING (0x0214) y modificarás los parámetros para que no se pueda cambiar la dimensión horizontal.

Pete Brown también tiene mucha información excelente sobre este tema en su blog.

1

Puede probar la vinculación de datos con el tamaño de la ventana y luego volver a establecer el tamaño en el valor anterior siempre que se modifique la dimensión vertical.

+0

El único inconveniente es que se trata de la publicación. – Amsakanna

+0

Es cierto. Pero en la mayoría de los casos, sospecho que será lo suficientemente rápido para que el usuario no lo note. –

26

Si desea utilizar el enfoque MinHeight y MaxHeight pero aún así permitir que la ventana de tamaño automáticamente para ajustarse al tamaño de su contenido:

<Window x:Class="MyWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     SizeToContent="WidthAndHeight" 
     ResizeMode="CanResize" 
     Loaded="window_Loaded"> 

En código subyacente:

private void window_Loaded(object sender, RoutedEventArgs e) 
{ 
    this.MinWidth = this.ActualWidth; 
    this.MinHeight = this.ActualHeight; 
    this.MaxHeight = this.ActualHeight; 
} 
+0

Así como Tim Richards recomienda, tuve que moverme al configurar las propiedades 'MinHeight' y' MaxHeight' en el evento 'ContentRendered' después de notar que el borde inferior de un' TextBox' y 'Button' estaban siendo recortados en una' Grid' contenida dentro de un 'GroupBox'. –

0

Si desea utilizar el enfoque MinHeight y MaxHeight pero aún permite que la ventana se ajuste automáticamente al tamaño de su contenido:

Para permitir el dimensionamiento automático del contenido, no use el evento Loaded. Use el evento ContentRendered en su lugar.

+0

¿Podría pegar el origen de esta cita? – Tomasito

0

Si usted tiene los siguientes requisitos: * Ancho usuario puede cambiar el tamaño (ResizeMode = CanResize) * Altura está dimensionada de forma automática (SizeToContent = Altura)

no va a funcionar por dos razones: * existe no es ResizeMode = CanResizeHeight * cuando el usuario cambia el tamaño de la ventana, reducirá SizeToContent a "Manual"

Un simple truco que utilizo es forzar constantemente "SizeToContent" a mi valor deseado.

<Window x:Class="MyWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    SizeToContent="Height" 
    ResizeMode="CanResize" 
    LayoutUpdated="LayoutUpdated"> 

private void LayoutUpdated(object sender, EventArgs e) 
{ 
    SizeToContent = SizeToContent.Height; 
} 

También puede usar el evento ContentRendered. El evento PropertyChanged no funcionará. Esto no es perfecto, ya que el usuario aún puede mover el cursor verticalmente, y causará cierto parpadeo si se hace rápidamente.

1

La siguiente solución le permite dejar intacta SizeToContent,
no requiere Win32 Interop o código detrás de su ventana:

lo hace se basan en Reactive Extensions

En el plazo Package Manager:

Install-Package System.Reactive 

Luego empiezas creando una nueva Behavior:

public class VerticalResizeWindowBehavior : Behavior<UIElement> 
{ 
    public static readonly DependencyProperty MinHeightProperty = DependencyProperty.Register("MinHeight", typeof(double), typeof(VerticalResizeWindowBehavior), new PropertyMetadata(600.0)); 
    public double MinHeight 
    { 
     get { return (double)GetValue(MinHeightProperty); } 
     set { SetValue(MinHeightProperty, value); } 
    } 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     var window = Window.GetWindow(AssociatedObject); 
     var mouseDown = Observable.FromEventPattern<MouseButtonEventArgs>(AssociatedObject, "MouseLeftButtonDown") 
            .Select(e => e.EventArgs.GetPosition(AssociatedObject)); 

     var mouseUp = Observable.FromEventPattern<MouseButtonEventArgs>(AssociatedObject, "MouseLeftButtonUp") 
           .Select(e => e.EventArgs.GetPosition(AssociatedObject)); 

     var mouseMove = Observable.FromEventPattern<MouseEventArgs>(AssociatedObject, "MouseMove") 
            .Select(e => e.EventArgs.GetPosition(AssociatedObject)); 

     var q = from start in mouseDown 
       from position in mouseMove.TakeUntil(mouseUp) 
       select new { X = position.X - start.X, Y = position.Y - start.Y }; 

     mouseDown.Subscribe(v => AssociatedObject.CaptureMouse()); 
     mouseUp.Subscribe(v => AssociatedObject.ReleaseMouseCapture()); 

     q.ObserveOnDispatcher().Subscribe(v => 
     { 
      var newHeight = window.Height + v.Y; 
      window.Height = newHeight < MinHeight ? MinHeight : newHeight;     
     }); 
    } 
} 

Luego se agrega una UIElement en la parte inferior de la ventana y aplicar los Behavior:

<Border Background="Gray" 
     Height="10" 
     Cursor="SizeNS" 
     Grid.ColumnSpan="2"> 
    <i:Interaction.Behaviors> 
     <b:VerticalResizeWindowBehavior MinHeight="600"/> 
    </i:Interaction.Behaviors> 
</Border> 

establezca las siguientes propiedades en la ventana:

ResizeMode="NoResize" 
SizeToContent="Width" 

Nota: En este ejemplo , el usuario puede cambiar el tamaño Vertically pero no Horizontally
Puede cambiar fácilmente el código para permitir el opp osite, o agregue las propiedades
para que sea configurable.

Cuestiones relacionadas