2010-02-27 12 views
5

Ich habe ein Textfeld und ein Datagrid innerhalb eines Dockpanels, das sich in einem WPF-Gruppenfeld befindet.WPF: Dynamische Höhe der 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> 

Ich füge Zeilen im Datagrid dynamisch aus dem Textfeld hinzu, wodurch das Datagrid vergrößert wird. Die Größe meiner Gruppenbox wird jedoch nicht dynamisch erhöht, obwohl die Höhe auf "Automatisch" eingestellt ist. Wie kann ich meine Groupbox abhängig von der Größe des Inhalts vergrößern und verkleinern?

Antwort

7

Sie haben Ränder auf allen 4 Seiten mit einer VerticalAlignment of Stretch. In einem Grid gibt dies Ihnen im Grunde eine GroupBox, die mit ihren Eltern, aber nicht mit ihrem Inhalt sortiert. Entfernen Sie den Rand von rechts und unten und ändern Sie die vertikale Ausrichtung nach oben.

Die Ränder sind die Reihenfolge von L, T, R, B. Null also die letzten zwei. Height = Auto und VerticalContentAlignment = Stretch sind die Standardwerte, so dass Sie diese auch loswerden können. Versuchen Sie, den XAML so sauber wie möglich zu halten.

Aus dem Markup wird deutlich, dass Sie den Designer von Blend oder Visual Studio verwenden. Ich würde vorschlagen, den Designer für den "Vorschau" -Modus zu verwenden, anstatt ihn zu bearbeiten. Obwohl es viel besser geworden ist, finde ich das Layoutverhalten des Designers in beiden Produkten sehr frustrierend. Wenn Sie sich mit der manuellen Erstellung von XAML vertraut machen, zahlt sich das auf lange Sicht aus.

Beispiel

du nach den Kommentaren, ich hinzufüge, ein Beispiel, wie Sie einen Datagrid haben würden, die automatisch ihre Mutterelemente bewirkt, basierend auf der Höhe wachsen. Beachten Sie, dass nur das Fenster selbst eine feste Größe hat. Wenn Sie das Fenster für ein Fenster auf der Grundlage der Höhe vergrößern möchten, können Sie SizeToContent = Height festlegen. Beachten Sie, dass Sie VerticalAlignment = Top nur auf dem äußersten Element festlegen müssen.

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

so toll gearbeitet und ich war in der Lage, dies zu dem Rest der Kontrollen im Netz anzuwenden. Ich habe jedoch noch eine Frage an dich. Das LayoutRoot für meine GroupBox ist ein Grid. Gerade jetzt, wenn meine GroupBox zu groß ist, wird der Boden vom LayoutRoot abgeschnitten. Ich versuche, meine gesamte wpf Größe basierend auf Inhalten zu ändern. Ich habe versucht, die gleiche Logik für die Groupbox anzuwenden, aber es funktioniert nicht. –

+0

Mein UserControl wird in einem Formular gehostet, das eine angrenzende Region des E-Mail-Formulars von Outlook ist. Muss ich einen Trigger setzen, wenn sich die Höhe des Benutzersteuerelements ändert? –

+0

Ja, eine Outlook-Region wird nicht automatisch skaliert. Sie müssen Ereigniscode verwenden, um das synchron zu halten. – Josh

1

Was ist der Container der GroupBox? Es könnte verhindern, dass es wächst.

Zum Beispiel, wenn der Container das Windows ist, hat es SizeToContent = "Höhe"?