2015-12-21 45 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

相關問題