2013-01-07 48 views
1

我有一个问题与GridSplitterGridSplitter自动调整

简单的示例代码:

<Grid x:Name="MainGrid"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="100"></RowDefinition> 
     <RowDefinition Height="2"></RowDefinition> 
     <RowDefinition Height="*"></RowDefinition> 
    </Grid.RowDefinitions> 
    <Grid x:Name="TopGrid" Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Red"/> 
    <GridSplitter ResizeDirection="Rows" Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="2" Background="Black" /> 
    <Grid x:Name="BottomGrid" Grid.Row="2" HorizontalAlignment="Stretch" Background="Aquamarine" VerticalAlignment="Stretch"/> 
</Grid> 

这就造成了两个垂直网格由GridSplitter分隔。

我想实现的是,GridSplitter自动对齐到网格的内容。 例如,如果我在底部网格中获得了可折叠元素,我希望顶部网格变大,如果我折叠该元素。如果我扩大它,顶部Grid应该变小。

我该怎么做?后来我会有3 's ...所以这个解决方案也应该与多个GridSplitter一起工作。

[编辑]:

我的XAML:

<Grid x:Name="MainGrid"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="100"> 
      <RowDefinition.MinHeight> 
       <MultiBinding Converter="{StaticResource ResourceKey=MultiValueConverter}"> 
        <Binding ElementName="dgStapelliste" Path="ActualHeight"></Binding> 
       </MultiBinding> 
      </RowDefinition.MinHeight> 
     </RowDefinition> 
     <RowDefinition Height="1"></RowDefinition> 
     <RowDefinition Height="*"></RowDefinition >   
    </Grid.RowDefinitions> 

    <Grid Grid.Row="0" Grid.Column="0" x:Name="Test"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="200"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <WPF:DataGrid GridHeaderContent="{Binding StapelListe.HeaderText}" SelectedItem="{Binding StapelListe.SelectedItem}" Grid.Row="0" Grid.Column="0" x:Name="dgStapelliste" HorizontalAlignment="Stretch" ItemsSource="{Binding StapelListe, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/> 
     <WPF:DataGrid GridHeaderContent="{Binding EinzelListe.HeaderText}" Grid.Row="0" Grid.Column="1" x:Name="dgEinzelliste" HorizontalAlignment="Stretch" ItemsSource="{Binding EinzelListe, Mode=OneWay}"/> 

     <GridSplitter Grid.Column="0" Width="1" VerticalAlignment="Stretch" Background="Black" /> 
    </Grid> 

    <Grid Grid.Row="2" Grid.Column="0" Grid.RowSpan="2"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="200"/> 
     </Grid.ColumnDefinitions> 

     <WPF:DataGrid GridHeaderContent="{Binding Anforderungsliste.HeaderText}" Grid.Column="0" x:Name="dgAnforderungsliste" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Anforderungsliste, Mode=OneWay}"/> 

     <GridSplitter Grid.Column="0" Width="1" VerticalAlignment="Stretch" Background="Black" /> 
    </Grid> 
    <GridSplitter Grid.Column="0" Grid.Row="1" Height="1" ResizeDirection="Rows" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="Black" x:Name="testSplitter" /> 
</Grid> 

回答

3

您可以使用MultiBinding来实现你想要的。

对于每个RowDefinition你设置这势必会对其内容的ActualHeight的,就像这样了minHeight:您展开控制

  <RowDefinition Height="100"> 
       <RowDefinition.MinHeight> 
        <MultiBinding Converter="{StaticResource ResourceKey=CalcAll}"> 
         <Binding ElementName="firstElementInThisRow" Path="ActualHeight"></Binding> 
         <Binding ElementName="secondElementInThisRow" Path="ActualHeight"></Binding> 
         <Binding ElementName="thirdElementInThisRow" Path="ActualHeight"></Binding> 
         <Binding ElementName="fourthElementInThisRow" Path="ActualHeight"></Binding> 
        </MultiBinding> 
       </RowDefinition.MinHeight> 
      </RowDefinition> 

你的转换可能看起来像

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     double result = 0.0; 
     foreach (object item in values) 
     { 
      result += System.Convert.ToDouble(item); 
     } 
     return result; 
    } 

    public object[] ConvertBack(object values, Type[] targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 

每次,它的ActualHeight变化和Binding获取更新 - >父类RowDefinition的MinHeight更改。

但是你不能设置一个,如果控制VerticalAlignment拉伸,因为然后ActualHeight不会通过扩大更改。因为现在我唯一可以想到的属性是DesiredSize.Height属性,所以不能使用绑定(如果DesiredSize.Height值发生更改,绑定不会更新)。 但pherhaps你可以使用一个属性(可以调用MinHeightRowOne)型双这就引起PropertyChanged事件在它的setter和绑定到第一行了minHeight(一个属性为每一行):

public double _minHeightRowOne; 
    public double MinHeightRowOne 
    { 
     get 
     { 
      return _minHeightRowOne; 
     } 
     set 
     { 
      _minHeightRowOne = value; 
      OnPropertyChanged("MinHeightRowOne"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 


<RowDefinition Height="100" MinHeight="{Binding Path=MinHeightRowOne}"/> 

现在第一行中此事件处理程序添加到每个控制SizeChanged将事件(针对每行一个处理程序):

private List<KeyValuePair<string,double>> oldVals = new List<KeyValuePair<string,double>>(); 

    private void ElementInRowOneSizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     FrameworkElement elem = (FrameworkElement)sender; 
     MinHeightRowOne -= oldVals.Find(kvp => kvp.Key == elem.Name).Value; 
     elem.Measure(new Size(int.MaxValue, int.MaxValue)); 
     MinHeightRowOne += elem.DesiredSize.Height; 
     oldVals.Remove(oldVals.Find(kvp => kvp.Key == elem.Name)); 
     oldVals.Add(new KeyValuePair<string, double>(elem.Name, elem.DesiredSize.Height)); 
    } 

通过此操作,MinHeight of the Row每次更改控件的大小时都会更新(其中应包括展开或折叠项目)。

请注意,每个控件都必须有唯一的名称才能完成此项工作。

+0

该解决方案的问题在于“ActualHeight”始终是该行的高度。如果将该行的高度设置为“100”,则该行中DataGrid的ActualHeight也为“100”...它不会总结可滚动内容 –

+0

您可以在您的问题中添加您的xaml吗? –

+0

好吧,我编辑它 –