Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF中使用DockStyle.Fill作为标准控件?_C#_Wpf_Tabcontrol_Docking - Fatal编程技术网

C# 如何在WPF中使用DockStyle.Fill作为标准控件?

C# 如何在WPF中使用DockStyle.Fill作为标准控件?,c#,wpf,tabcontrol,docking,C#,Wpf,Tabcontrol,Docking,我从windows窗体中使用,我创建一个面板,将控件放在其中,并为它们提供DockStyle.Fill以最大化它们与周围面板的大小 在WPF中,我想要同样的。我有一个TabControl,我希望它的大小能够尽可能多地填充表单。 我有一个ribbon控件(RibbonControlsLibrary),希望表单的其余部分以最大大小填充TabControl (我不想像Visual Studio中的停靠那样停靠控件,只想停靠旧的停靠机制)只需将控件包装在两行网格中即可。网格将自动使用指定给它的所有空间,

我从windows窗体中使用,我创建一个面板,将控件放在其中,并为它们提供
DockStyle.Fill
以最大化它们与周围面板的大小

在WPF中,我想要同样的。我有一个TabControl,我希望它的大小能够尽可能多地填充表单。 我有一个ribbon控件(RibbonControlsLibrary),希望表单的其余部分以最大大小填充TabControl


(我不想像Visual Studio中的停靠那样停靠控件,只想停靠旧的停靠机制)

只需将控件包装在两行网格中即可。网格将自动使用指定给它的所有空间,您可以定义行,通过将其高度设置为“*”来占用所有剩余空间。我的示例中的第一行(Height=“Auto”)将占用功能区所需的空间。希望有帮助

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="*" />
  </Grid.RowDefinitions>

  <Ribbon Grid.Row="0" />

  <TabPage Grid.Row="1" />
</Grid>


通过将“Grid.Row=…”属性添加到网格的子控件,可以将它们分配给网格的行。然后网格将根据行定义来调整其子项的大小。

您只需说出
DockPanel
LastChildFill=“True”
就可以做您想做的事情,然后确保您想做的填充实际上是最后一个子项

网格是布局的野兽,您可以让它做任何事情,但DockPanel通常是最外层布局面板的正确选择。以下是一个psuedocode示例:

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

    <MyFillingTabControl />
</DockPanel>

WinForms DockStyle.Fill的WPF等价物是:

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>
  <Button Content="Why am I squished flat?" />
</StackPanel>

切换到另一个面板,您就可以开始了:

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

同样,任何高度为“自动”的网格行或列也会在该方向上挤压其内容

一些不会挤压孩子的容器示例如下:

  • ContentControl从不挤压其子项(包括边框、按钮、复选框、ScrollViewer等)
  • 具有单个行和列的网格
  • 具有“*”大小的行和列的网格
  • DockPanel不会挤压它的最后一个孩子
  • TabControl不会压缩其内容
确实挤压孩子的容器的一些示例如下:

  • StackPanel在其方向上挤压
  • 具有“自动”大小的行或列的网格将向该方向挤压
  • DockPanel将其最后一个孩子挤向码头方向
  • TabControl挤压其标题(选项卡上显示的内容)
3。更远处的明确高度或宽度

在给定明确的高度和宽度的情况下,我看到Grid或DockPanel的次数是惊人的,如下所示:

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

通常,您永远不希望为任何面板指定明确的高度或宽度。诊断布局问题时,我的第一步是删除我能找到的所有显式高度或宽度

4。窗口大小为内容大小,但不应为


使用SizeToContent时,内容将压缩到最小大小。在许多应用中,这非常有用,是正确的选择。但是,如果您的内容没有“自然”大小,那么您可能希望省略SizeToContent。

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

直到我发现


//违约
//水平对齐=“拉伸”
//垂直对齐=“拉伸”
例如:

//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);
//用户控件:
//网格:
//代码:
Grid_test.Children.Add(UC_test);
便于设计

<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;

//代码
Grid_test.Children.Add(UC_test);
UC_测试宽度=Double.NaN;
UC_测试高度=Double.NaN;

方向正确,谢谢。我设法插入了网格,但现在我需要告诉TabControl它应该使用所有可用的大小?如何实现这一点?您需要为TabControl添加“Grid.Row”属性,并为相应的行定义指定“*”的高度-如示例所示。另请注意:在重新编译之前,它不会在设计视图中更新。“”我崩溃了!XDI否决了您的评论,因为您的建议无效。设置这两个属性会使面板无限小,而不是将其延伸到侧面。
<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;