WPF: динамическая высота GroupBox

У меня есть текстовое поле и сетка данных внутри док-панели, которая находится в групповом поле WPF.

<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>

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


person Rick Make    schedule 27.02.2010    source источник


Ответы (2)


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

Поля имеют порядок 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( );
    }
}
person Josh    schedule 27.02.2010
comment
Это отлично сработало, и я смог применить это к остальным элементам управления в сетке. Однако у меня к вам еще один вопрос. LayoutRoot для моего GroupBox - это сетка. Прямо сейчас, если мой GroupBox слишком большой, то нижняя часть отрезается LayoutRoot. Я пытаюсь изменить общий размер WPF в зависимости от содержимого. Я попытался применить ту же логику для группового ящика, но это не работает. - person Rick Make; 27.02.2010
comment
Мой UserControl размещен в форме, которая является прилегающей областью формы электронной почты Outlook. Нужно ли мне устанавливать триггер при изменении высоты пользовательского элемента управления? - person Rick Make; 28.02.2010
comment
Да, размер региона Outlook не будет изменяться автоматически. Вам нужно будет использовать код события, чтобы синхронизировать это. - person Josh; 01.03.2010

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

Например, если контейнер - это Windows, имеет ли он SizeToContent = "Height"?

person Timores    schedule 27.02.2010