我使用网格来平衡3个部分。前两个占据剩余空间的50%,最后两个占据底部相同的高度,因为它是一个带按钮的栏。
我使用GridSplitter来允许前两个元素之间的动态调整大小,但删除它也不会改变任何东西。
这是一个最小的工作示例:
XAML:
<Window x:Class="TestWPFApplication.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:TestWPFApplication"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="rootGrid">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBox
x:Name="firstBox"
Grid.Row="0"
AcceptsReturn="True"
AcceptsTab="True"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto"/>
<GridSplitter x:Name="splitter" Grid.Row="1" Height="5" HorizontalAlignment="Stretch" />
<TextBox
x:Name="secondBox"
Grid.Row="2"
AcceptsReturn="True"
AcceptsTab="True"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto"/>
<Button Grid.Row="3" Content="Collapse" Click="Button_Click"/>
</Grid>
</Window>
CS:
namespace TestWPFApplication
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
splitter.Visibility = Visibility.Collapsed;
secondBox.Visibility = Visibility.Collapsed;
}
}
}
单击按钮后,第二个文本框和gridsplitter崩溃,所以我不能再使用它们了(所需的),但剩下的文本框不会占用剩余的空间(不需要的)。
在我的理解中,因为行有一个高度星,它应该自动调整它的空间。我是否需要调用类似updateUI的函数,以便第一个文本框自动调整大小?
答案 0 :(得分:1)
您观察到此类行为,导致第一和第三个网格行的高度设置为&#39; *&#39;。设置第二个Stream
后,第三个网格行的可见性不会消失。因此,如果您在textBox
事件处理程序中写入类似的内容,那么所有内容都应该像预期的那样工作。
Button_Click
我可以建议使用rootGrid.RowDefinitions[2].MaxHeight = 0;
来获取此属性。您可以使用DataBinding
将第二个TextBox
Visibility
属性绑定到第三个RowDefinition MaxHeight
属性。但我不知道你项目的限制。