当另一个设置为折叠时,WPF网格元素不会调整大小

时间:2015-12-21 11:04:08

标签: c# .net wpf visibility

我使用网格来平衡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的函数,以便第一个文本框自动调整大小?

1 个答案:

答案 0 :(得分:1)

您观察到此类行为,导致第一和第三个网格行的高度设置为&#39; *&#39;。设置第二个Stream后,第三个网格行的可见性不会消失。因此,如果您在textBox事件处理程序中写入类似的内容,那么所有内容都应该像预期的那样工作。

Button_Click

我可以建议使用rootGrid.RowDefinitions[2].MaxHeight = 0; 来获取此属性。您可以使用DataBinding将第二个TextBox Visibility属性绑定到第三个RowDefinition MaxHeight属性。但我不知道你项目的限制。