我对可调整大小的WPF窗口的设计有疑问。 结果是窗口元素会自动调整大小,同时通过鼠标拖动来改变窗口的宽度和高度。
基本面板是Dockpanel,第一个元素是位于顶部的ToolBar。 然后是一个有两行的网格。 在每个行中都有一个带内部元素的DockPanel。 其中一些元素可以被Visibilty.Collapsed隐藏(这将由最终版本中的属性生成)。 出于测试目的,我在ToolBar之后有两个DockPanel,并且我已将XAML文件中第一个的可见性设置为Collapsed。 当我启动应用程序时,窗口似乎是正确的。
但是当我单击窗口底部以通过拖动更改高度时,第二个Dockpanel会变小,并且折叠的Dockpanel所在的位置会变得可见。
我做错了什么?
这是我的XAML:
<Window x:Class="WPFResizable.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPFResizable"
mc:Ignorable="d"
Title="MainWindow"
SizeToContent="Height"
Width="525">
<DockPanel VerticalAlignment="Stretch" Background="AliceBlue">
<Button DockPanel.Dock="Top" Height="40" Content="ToolBar"/>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DockPanel Grid.Row="0" Grid.Column="0" VerticalAlignment="Stretch" Visibility="Collapsed">
<GroupBox Margin="5"
Header="Group 1">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<TextBox Text="Test 1"
MinWidth="400"
MinHeight="100"
Margin="5"/>
</ScrollViewer>
</GroupBox>
</DockPanel>
<DockPanel Grid.Row="1" Grid.Column="0" VerticalAlignment="Stretch">
<GroupBox Margin="5"
Header="Group 2">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<TextBox Text="Test 2"
MinWidth="400"
MinHeight="100"
Margin="5"/>
</ScrollViewer>
</GroupBox>
</DockPanel>
</Grid>
</DockPanel>
</Window>
答案 0 :(得分:1)
如果我正确地理解了你想要做的事情,我认为这会做你想要的。
VerticalAlignment="Stretch"
对于Grid子项来说是多余的,如果只有一列,则不需要在子项上指定Grid.Column
。您的第一个网格行had Height="*"
,无论其内容是否可见,都会占据网格高度的一半。我已经编写了一个带有触发器的样式,当其内容不可见时,该行会将该行的高度更改为Auto
。这取决于行中只有一个元素,但由于你在那里有一个DockPanel
,你似乎已经在思考这些问题了。
<Grid DockPanel.Dock="Bottom">
<Grid.RowDefinitions>
<RowDefinition>
<RowDefinition.Style>
<Style TargetType="RowDefinition">
<!--
Must set the default in a Setter instead of an attribute, or
dependency property precedence will override the trigger
below.
-->
<Setter Property="Height" Value="*" />
<Style.Triggers>
<DataTrigger
Binding="{Binding Visibility, ElementName=TopChildPanel}"
Value="Collapsed"
>
<Setter Property="Height" Value="Auto" />
</DataTrigger>
</Style.Triggers>
</Style>
</RowDefinition.Style>
</RowDefinition>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DockPanel x:Name="TopChildPanel" Grid.Row="0" Visibility="Visible">
<GroupBox Margin="5"
Header="Group 1">
<ScrollViewer
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<TextBox Text="Test 1"
MinWidth="400"
MinHeight="100"
Margin="5"/>
</ScrollViewer>
</GroupBox>
</DockPanel>
<DockPanel Grid.Row="1">
<GroupBox
Margin="5"
Header="Group 2">
<ScrollViewer
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
>
<TextBox
Text="Test 2"
MinWidth="400"
MinHeight="100"
Margin="5"/>
</ScrollViewer>
</GroupBox>
</DockPanel>
</Grid>