2010-02-27 18 views
5

Tengo un cuadro de texto y una cuadrícula de datos dentro de un panel de puertos que se encuentra en un grupo de grupos de WPF.WPF: Altura dinámica de GroupBox

<GroupBox Margin="8,142.04,1.783,230.4" Height="Auto" Header="Desired Meeting Outcomes (decisions or actions)?" MaxWidth="635" MinWidth="550" FontWeight="Bold" FontSize="13.333" BorderBrush="#FFD5DFE5" MinHeight="106" VerticalContentAlignment="Stretch"> 
     <DockPanel Margin="0"> 
      <local:TextboxControl Margin="0" d:LayoutOverrides="Height, HorizontalMargin" Width="538.217" VerticalAlignment="Top" HorizontalAlignment="Left" DockPanel.Dock="Top"/> 
      <local: Height="Auto" HorizontalAlignment="Left" MinHeight="25" MinWidth="538" DockPanel.Dock="Top"/> 
     </DockPanel> 
    </GroupBox> 

Estoy añadiendo filas de la cuadrícula de datos dynmaically desde el cuadro de texto haciendo que la cuadrícula de datos crezca. Sin embargo, la altura de mi groupbox no crece dinámicamente aunque su altura esté configurada en Auto. ¿Cómo puedo hacer que mi groupbox crezca y se reduzca en función del tamaño de los contenidos que contiene?

Respuesta

7

Tiene márgenes establecidos en los 4 lados con una alineación vertical de estiramiento. En una cuadrícula esto básicamente le dará un GroupBox que se dimensiona con su elemento primario pero no su contenido. Retire el margen de la derecha e inferior y cambie la alineación vertical a la parte superior.

Los márgenes son del orden de L, T, R, B. Así que ponga a cero los dos últimos. Height = Auto y VerticalContentAlignment = Stretch son los valores predeterminados para que pueda deshacerse de ellos también. Intenta mantener el XAML lo más limpio posible.

El diseñador de Blend o Visual Studio indica claramente que está utilizando el marcado. Sugiero usar el diseñador para el modo "vista previa" en lugar de editar. Aunque ha mejorado mucho, creo que el comportamiento de diseño del diseñador en ambos productos es muy frustrante. Familiarizarse con la creación de XAML a mano paga dividendos a largo plazo.

Ejemplo

De acuerdo con los comentarios, estoy añadiendo un ejemplo de cómo se tendría una cuadrícula de datos que hace que sus elementos primarios para crecer automáticamente en función de la altura. Tenga en cuenta que solo la ventana tiene un tamaño fijo. Para una ventana, si desea hacer que crezca en función de la altura, puede configurar SizeToContent = Height. Observe que solo necesita establecer VerticalAlignment = Top en el elemento más externo.

MainWindow.xaml

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Width="640" Height="480"> 
    <Grid x:Name="LayoutRoot" Background="Green" VerticalAlignment="Top"> 
     <Border Margin="5" BorderBrush="Yellow" BorderThickness="4"> 
      <GroupBox Header="Data Grid" Background="Orange"> 
       <DataGrid x:Name="dg" AutoGenerateColumns="True" /> 
      </GroupBox> 
     </Border> 
    </Grid> 
</Window> 

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     var items = new ObservableCollection<DateTime>(); 
     dg.ItemsSource = items; 

     var timer = new DispatcherTimer(); 
     timer.Interval = TimeSpan.FromSeconds(2); 
     timer.Tick += (s, e) => items.Add(DateTime.Now); 
     timer.Start(); 
    } 
} 
+0

que funcionó muy bien y yo era capaz de aplicar esto al resto de los controles en la red. Sin embargo, tengo una pregunta más para ti. El LayoutRoot para mi GroupBox es una cuadrícula. En este momento, si mi GroupBox es demasiado grande, la parte inferior queda cortada por LayoutRoot. Intento que mi wpf general cambie de tamaño según el contenido. Intenté aplicar la misma lógica para groupbox pero no funciona. –

+0

Mi UserControl está alojado en un formulario que es una región contigua del formulario de correo electrónico de Outlook. ¿Debo configurar un disparador cuando cambia la altura del control de usuario? –

+0

Sí, una región de Outlook no cambiará el tamaño automáticamente. Deberá usar el código de evento para mantenerlo sincronizado. – Josh

1

¿Cuál es el contenedor del GroupBox? Podría evitar que crezca.

Por ejemplo, si el contenedor es Windows, ¿tiene SizeToContent = "Height"?

Cuestiones relacionadas