WPF:GroupBox 动态高度

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,我的分组框的高度仍然不会动态增长。我该如何使我的分组框根据其容纳的内容大小而增长和缩小?

2个回答

12
您有四个边缘都设置了间距,并且垂直对齐方式为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( );
    }
}

那个很好用,我能够将其应用到网格中的其他控件上。然而,我还有一个问题要问你。我的GroupBox的LayoutRoot是一个Grid。现在,如果我的GroupBox太大,那么LayoutRoot会将底部截断。我正在尝试根据内容调整我的整体wpf大小。我尝试将相同的逻辑应用于GroupBox,但它不起作用。 - Rick Make
我的UserControl托管在一个窗体中,该窗体是Outlook电子邮件表单的相邻区域。当用户控件的高度发生变化时,我需要设置触发器吗? - Rick Make
是的,Outlook 区域不会自动调整大小。您需要使用事件代码来保持同步。 - Josh

1

GroupBox的容器是什么?它可以防止它变大。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接