2010-02-27 3 views
5

У меня есть текстовое поле и datagrid внутри док-панели, которая находится в групповом поле WPF.WPF: динамическая высота 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> 

Я добавляю строки в DataGrid dynmaically из текстового поля, в результате чего DataGrid расти. Тем не менее, высота моего группового окна не растет динамически, даже если для его высоты установлено значение Авто. Как я могу заставить свой групповой пакет расти и сокращаться в зависимости от размера содержимого, которое он держит?

ответ

7

У вас есть поля, установленные на всех 4 сторонах с вертикальным выравниванием растяжки. В Grid это в основном даст вам GroupBox, размер которого зависит от его родителя, но не его содержимого. Удалите границу справа и снизу и измените Вертикальное выравнивание на верх.

Поля - это порядок L, T, R, B. Так что нуль из последних двух. Height = Auto и VerticalContentAlignment = Stretch - значения по умолчанию, поэтому вы также можете избавиться от них. Постарайтесь сохранить XAML как можно более чистым.

Из разметки видно, что вы используете Blend или конструктор Visual Studio. Я бы предложил использовать конструктор для режима предварительного просмотра, а не для редактирования. Хотя это стало намного лучше, я считаю, что поведение макета дизайнера в обоих продуктах очень расстраивает. Знакомство с созданием XAML вручную дает дивиденды в долгосрочной перспективе.

Пример

Согласно комментариям, я добавляю пример того, как вы бы DataGrid, который вызывает его родительские элементы, чтобы расти автоматически на основе высоты. Обратите внимание, что только само окно имеет фиксированный размер. Для окна, если вы хотите, чтобы он расти по высоте, вы можете установить SizeToContent = Height. Обратите внимание, что вам нужно только установить VerticalAlignment = Top на внешний элемент.

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

Это хорошо работали, и я был в состоянии применить это к остальной части управления в сетке. Однако у меня есть еще один вопрос для вас. LayoutRoot для моей GroupBox - это сетка. Прямо сейчас, если мой GroupBox слишком велик, тогда нижняя часть обрезается LayoutRoot. Я стараюсь иметь общий размер wpf в зависимости от содержимого. Я попытался применить ту же логику для группового ящика, но он не работает. –

+0

My UserControl размещен в форме, которая является прилегающей областью электронной почты Outlook. Нужно ли устанавливать триггер при изменении высоты пользовательского контроля? –

+0

Да, область Outlook не будет автоматически изменяться. Вам нужно будет использовать код события, чтобы синхронизировать его. – Josh

1

Что такое контейнер GroupBox? Это может помешать этому росту.

Например, если контейнер является Windows, имеет ли он значение SizeToContent = "Height"?