2012-08-24 39 views
1

我有以下電網:鏈接擴展行動RowDefinition高度

  <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition/> 
        <RowDefinition Height="Auto"/> 
       </Grid.RowDefinitions> 
... 

       <Expander Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2"> 
        <TextBox /> 
       </Expander> 

文本框填充膨脹。我想這樣設置,當底行被展開時,行高是自動/ */*,當底部被摺疊時,行高是自動/ * /自動。我試過(沒有成功)使用樣式觸發器來做到這一點,並希望儘可能在XAML中代替代碼。在此先感謝...

+0

昨晚我剛剛有這個確切的問題,還沒有想出一個好的解決方案。 – CodingGorilla

回答

1

到目前爲止,這是我的醜陋的解決方法:

<Window.Resources> 
    <Style TargetType="Expander"> 
     <EventSetter Event="Expanded" Handler="ExpanderGrow"/> 
     <EventSetter Event="Collapsed" Handler="ExpanderGrow"/> 
    </Style> 
</Window.Resources> 

...和CS要求:

public void ExpanderGrow(object sender, RoutedEventArgs e) 
    { 
     Expander expander = (Expander)sender; 
     Grid grid = (Grid)expander.Parent; 
     int index = Grid.GetRow(expander); 
     RowDefinition rowdef = grid.RowDefinitions[index]; 

     rowdef.Height = new GridLength(1, 
      expander.IsExpanded ? GridUnitType.Star : GridUnitType.Auto); 
    } 
+1

像魅力一樣工作。 – BoboProg

2

我能想到的這樣的兩種簡單的方法

第一個將根據Expander.IsExpanded值調整網格的RowDefinitions。我有一些GridHelpers on my blog,它允許你綁定網格的行和列定義,而不必手動定義它們,這使得這更容易。使用這些傭工,最終的結果是這樣的:

<Grid local:GridHelpers.RowCount="3"> 
    <Grid.Style> 
     <Style TargetType="{x:Type Grid}"> 
      <Setter Property="local:GridHelpers.StarRows" Value="1" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=MyExpander, Path=IsExpanded}" Value="True"> 
        <Setter Property="local:GridHelpers.StarRows" Value="1,2" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Grid.Style> 

    ... 

    <Expander x:Name="MyExpander" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2"> 
     <TextBox /> 
    </Expander> 

</Grid> 

第二個選擇是使用一個ConverterTrigger那臺時,它的擴大Expander.MinHeight(Grid.ActualHeight - Row0Content.ActualHeight)/2。我也有一個MathConverter on my blog,這可能會使這更容易,或者你可以創建自己的。

<Grid x:Name="MyGrid"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 

    <TextBox Height="50" Grid.Row="0" /> 
    <TextBox Grid.Row="1" /> 

    <Expander Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2"> 
     <Expander.Style> 
      <Style TargetType="{x:Type Expander }"> 
       <Setter Property="MinHeight" Value="0" /> 
       <Style.Triggers> 
        <Trigger Property="IsExpanded" Value="True"> 
         <Setter Property="MinHeight" Value="{Binding 
          ElementName=MyGrid, 
          Path=ActualHeight, 
          Converter={StaticResource MathConverter}, 
          ConverterParameter=((@VALUE-50)/2)" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Expander.Style> 

     <TextBox /> 
    </Expander> 
</Grid> 

我的博客上該轉換器,如果你因爲它經常IValueConverter知道ROW0的高度提前只會工作,但它是很容易轉換成IMultiValueConverter如果你需要將它傳遞0行的高度,以及。我其實已經有了這個代碼,但是我還沒有開始更新我的博客文章。

+0

這些看起來不錯,但是......第一個需要額外的依賴關係,第二個通過手動執行平均來擊敗行定義單元的機制。糾正我,如果我錯了 - 第二個將需要修改,每當你添加一個新的行到網格。 – Reinderien

+0

@Reinderien您無論何時調整Grid時都需要對第二個實現進行調整,不過您可以使用「IMultiValueConverter」輕鬆做同樣的事情並將其傳遞給您需要的任何參數,網格的其餘部分看起來像。第一個只是一個'AttachedProperty',每當觸發值發生變化時就修改'RowDefinitions',這與你自己的回答非常相似(這也是一種有效的方法)。 – Rachel