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