如何使用DockStyle.Fill在WPF中的标准控件?

我对WPF很陌生。 我使用的窗体,我创build一个面板,放置在其中的控制,并给他们DockStyle.Fill最大限度地扩大其周围面板的大小。

在WPF中我想拥有相同的。 我有一个选项卡控件,我希望它的大小尽可能多地填写表单。 我有一个function区控件(RibbonControlsLibrary),并希望窗体的其余部分用最大尺寸的选项卡控件填充。

(我不想停靠在Visual Studio中的对接控件,只是旧的对接机制)

WPF等价于WinForms的DockStyle.Fill是:

HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 

这是几乎所有控件的默认设置,所以一般来说,你不需要做任何事情来让WPF控件填充它的父容器 :它们是自动完成的。 对于不把孩子挤压到最小尺寸的所有容器都是如此。

常见的错误

我现在将解释几个常见的错误,防止HorizontalAlignment="Stretch" VerticalAlignment="Stretch"按预期工作。

1.显式高度或宽度

一个常见的错误是明确指定一个控件的宽度或高度。 所以如果你有这个:

 <Grid> <Button Content="Why am I not filling the window?" Width="200" Height="20" /> ... </Grid> 

只要删除宽度和高度属性:

 <Grid> <Button Content="Ahhh... problem solved" /> ... </Grid> 

2.包含面板挤压控制到最小的大小

另一个常见的错误是让包含面板挤压你的控制尽可能紧。 例如,一个垂直的StackPanel将总是垂直地挤压它的内容,

 <StackPanel> <Button Content="Why am I squished flat?" /> </StackPanel> 

转到另一个面板,你会很好去:

 <DockPanel> <Button Content="I am no longer squished." /> </DockPanel> 

此外,任何高度为“自动”的网格行或列都将同样挤压其内容。

容器的一些例子不挤压他们的孩子是:

  • ContentControls永远不会挤压他们的孩子(这包括边界,button,checkbox,ScrollViewer等)
  • 具有单个行和列的网格
  • 具有“*”大小的行和列的网格
  • DockPanel不挤最后一个孩子
  • TabControl不挤压其内容

容器的一些例子挤压他们的孩子是:

  • StackPanel按其方向挤压
  • 具有“自动”大小的行或列的网格朝这个方向挤压
  • DockPanel除了最后一个孩子以外,都挤在docker方向上
  • TabControl挤压其标题(选项卡上显示的内容)

3.进一步显示高度或宽度

看到Grid或DockPanel被赋予了一个明确的高度和宽度,这是多么的惊人:

 <Grid Width="200" Height="100"> <Button Content="I am unnecessarily constrainted by my containing panel" /> </Grid> 

一般来说,你永远不想给任何面板一个明确的高度或宽度。 诊断布局问题时,我的第一步是删除每个可以find的高度或宽度。

4.窗口应该是SizeToContent

当您使用SizeToContent时,您的内容将被挤压到最小尺寸。 在许多应用中,这是非常有用的,是正确的select。 但是,如果你的内容没有“自然”的大小,那么你可能会想要省略SizeToContent。

你可以通过说DockPanel LastChildFill="True"来做你想做的LastChildFill="True" ,然后确定你想成为填充者实际上是最后一个孩子!

网格是一个布局的野兽,你可以做任何事情,但DockPanel通常是你最外面的布局面板的正确select。 这是一个伪代码示例:

 <DockPanel LastChildFill="True"> <MyMenuBar DockPanel.Dock="Top"/> <MyStatus DockPanel.Dock="Bottom"/> <MyFillingTabControl /> </DockPanel> 

只需将您的控件包装在两行的网格中。 网格会自动使用给定的所有空间,您可以通过给它们一个高度“*”来定义行来占据所有的空间。 在我的例子(高度=“自动”)的第一行将花费尽可能多的function区所需的空间。 希望有所帮助。

 <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Ribbon Grid.Row="0" /> <TabPage Grid.Row="1" /> </Grid> 

通过将“Grid.Row = ..”属性添加到网格的子控件,它们被分配到网格的行。 然后网格会根据行定义的大小定义它的大小。

我在这里尝试了很多方法,但无法解决我的问题。 (在控制中填充其他控件)

直到我find它

 <Name_Control Height="auto" Width="auto"/> //default //HorizontalAlignment="Stretch" //VerticalAlignment="Stretch" 

例:

 //UserControl: <UserControl Name="UC_Test" Height="auto" Width="auto" /> //Grid: <Grid Name="Grid_test" Grid.ColumnSpan="2" Grid.Row="2" /> //Code: Grid_test.Children.Add(UC_Test); 

为了便于devise

 <UserControl Name="UC_Test" Height="100" Width="100" /> //Code Grid_test.Children.Add(UC_Test); UC_Test.Width = Double.NaN; UC_Test.Height = Double.NaN;