9

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

我正在从文本框中动态地在数据网格中添加行,导致数据网格增长。但是,即使它的高度设置为 Auto,我的 groupbox 的高度也不会动态增长。我怎样才能让我的 groupbox 根据它所包含的内容的大小来增长和缩小?

4

2 回答 2

12

您在所有 4 个边上都设置了边距,垂直对齐为 Stretch。在 Grid 中,这基本上会给你一个 GroupBox,它的大小与它的父级而不是它的内容有关。从右侧和底部移除边距,并将 VerticalAlignment 更改为 Top。

边距是 L、T、R、B 的顺序。所以最后两个归零。Height=Auto 和 VerticalContentAlignment=Stretch 是默认设置,因此您也可以摆脱它们。尽量保持 XAML 干净。

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

例子

根据评论,我添加了一个示例,说明如何拥有一个 DataGrid,它会导致其父元素根据高度自动增长。请注意,只有 Window 本身具有固定大小。对于一个窗口,如果你想让它基于高度增长,你可以设置 SizeToContent=Height。请注意,您只需要在最外层元素上设置 VerticalAlignment=Top。

主窗口.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>

主窗口.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( );
    }
}
于 2010-02-27T08:44:37.857 回答
1

GroupBox 的容器是什么?它可以阻止它生长。

例如,如果容器是 Windows,它是否具有 SizeToContent="Height" ?

于 2010-02-27T08:36:17.940 回答