2015-12-21 43 views
1

我正在使用网格来平衡3个部分。前两个应占剩余空间的50%,后两个应保持底部相同的高度,因为它是一个带按钮的酒吧。当另一个设置为折叠时,WPF网格元素不会调整大小

我使用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

您会观察到这种行为,导致第一个和第三个网格行的高度设置为'*'。设置第二个textBox后,第3个网格行的可见性不会消失。所以如果你在Button_Click事件处理程序中写这样的东西,所有应该像预期的那样工作。

rootGrid.RowDefinitions[2].MaxHeight = 0; 

我可以建议使用DataBinding为它的属性来实现这一点。您可以将第二个TextBoxVisibility属性绑定到第三个RowDefinition MaxHeight属性与ValueConverter。但我不知道你的项目的限制。

+0

虽然这确实有效并且顶盒已调整大小,但这意味着我必须保存该值。我不明白为什么我需要DataBinding部分,因为MWE的内容位于我项目中的TabItem中,我只想提供一种可能性来减少第二个文本框,以便在第一个文本框中具有更多空间。你能解释为什么这是必要的吗?或者为什么它不能按我的预期工作。 – Crumar

+0

如果你愿意,你可以在代码后面写这个,如果你不想手动设置'MaxHeight',你可以写'绑定'。我编辑了答案。 – bars222

+0

嗯,我在函数中实现了这个,因为我需要保存MaxHeight的值来再次显示文本框。然而,我会等待更多的答案,因为我认为这更多的是解决方法。 upvoted虽然 – Crumar

相关问题