WPF:GroupBox动态高度

Ric*_*ake 7 wpf groupbox

我在WPF组框中的dockpanel内部有一个文本框和数据网格.

<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>
Run Code Online (Sandbox Code Playgroud)

我正在从文本框中动态添加数据网格中的行,从而导致数据网格增长.但是,即使其高度设置为"自动",我的组合框的高度也不会动态增长.如何根据其所包含的内容大小使我的groupbox增长和缩小?

Jos*_*osh 10

您使用VerticalAlignment of Stretch在所有4个边上设置了边距.在Grid中,这基本上会为您提供一个GroupBox,其大小与其父级而不是其内容.从右侧和底部删除边距,并将VerticalAlignment更改为Top.

边距是L,T,R,B的顺序.所以最后两个为零.高度=自动和VerticalContentAlignment =拉伸是默认值,因此您也可以摆脱它们.尽量保持XAML尽可能干净.

从标记中可以清楚地看到,您正在使用Blend或Visual Studio的设计器.我建议使用设计器进行"预览"模式而不是编辑.虽然它变得更好,但我发现设计师在两种产品中的布局行为都非常令人沮丧.从长远来看,熟悉手工创建XAML会带来好处.

根据评论,我添加了一个示例,说明如何使DataGrid导致其父元素根据高度自动增长.请注意,只有Window本身具有固定大小.对于一个窗口,如果你想让它根据高度增长,你可以设置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>
Run Code Online (Sandbox Code Playgroud)

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( );
    }
}
Run Code Online (Sandbox Code Playgroud)