WPF: динамическая высота GroupBox - PullRequest
7 голосов
/ 27 февраля 2010

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

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

Ответы [ 2 ]

10 голосов
/ 27 февраля 2010

У вас есть поля, установленные на всех 4 сторонах с вертикальным выравниванием растяжения. В 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( );
    }
}
1 голос
/ 27 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...