2010-02-27 182 views
5

我有一个WPF组框中的dockpanel内的文本框和数据网格。WPF:GroupBox动态高度

<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增长的文本框导致datagrid行中的行。但是,即使其高度设置为“自动”,我的群组高度也不会动态增长。我怎样才能让我的groupbox根据它所拥有的内容的大小来增长和缩小?

回答

7

您在所有4个边上都设置了利用VerticalAlignment of Stretch设置的边距。在一个网格中,这基本上会给你一个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(); 
    } 
} 
+0

这伟大的工作,我能够将其应用到控制网格休息。不过,我还有一个问题要问你。我的GroupBox的LayoutRoot是一个Grid。现在,如果我的GroupBox太大,底部会被LayoutRoot截断。我尝试让我的整体wpf根据内容调整大小。我试图对groupbox应用相同的逻辑,但它不起作用。 – 2010-02-27 14:08:09

+0

我的UserControl位于Outlook电子邮件表单的邻接区域中。当用户控件的高度发生变化时,是否需要设置触发器? – 2010-02-28 13:27:55

+0

是的,Outlook区域不会自动调整大小。您将需要使用事件代码来保持同步。 – Josh 2010-03-01 02:04:14

1

什么是GroupBox的容器?它可以防止它增长。

例如,如果容器是Windows,它是否有SizeToContent =“Height”?