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

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

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

7
задан Rick Make 27 February 2010 в 04:54
поделиться

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( );
    }
}
10
ответ дан 6 December 2019 в 23:04
поделиться

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

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

1
ответ дан 6 December 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: