首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GridSplitter自动调整大小

GridSplitter自动调整大小
EN

Stack Overflow用户
提问于 2013-01-07 17:44:16
回答 1查看 1K关注 0票数 1

我的GridSplitter出了点问题

简单的示例代码:

代码语言:javascript
复制
<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应该会变得更小。

我该怎么做呢?稍后我将有4个带有3个GridSplitterGrids…因此,该解决方案也应该适用于多个GridSplitter

编辑

我的xaml:

代码语言:javascript
复制
 <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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-07 18:59:42

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

为每个RowDefinition设置一个绑定到其内容的MinHeight,如下所示:

代码语言:javascript
复制
<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>

您的转换器可能如下所示:

代码语言:javascript
复制
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都会更改,绑定也会更新父RowDefinition的MinHeight。

但是,如果控件的VerticalAlignment设置为Stretch,则不能将其设置为Stretch,因为这样ActualHeight就不会因为展开而改变。

编辑:因为我现在能想到的唯一属性是DesiredSize.Height- property,所以你不能使用绑定(如果DesiredSize.Height-value发生变化,绑定就不会更新)。但也许您可以使用double类型的属性(让我们称其为MinHeightRowOne),它在其setter中引发PropertyChanged事件,并绑定到前几行MinHeight (每行一个属性):

代码语言:javascript
复制
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));
    }
}
代码语言:javascript
复制
<RowDefinition Height="100" MinHeight="{Binding Path=MinHeightRowOne}"/>

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

代码语言:javascript
复制
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都会更新。

请注意,每个控件都必须有一个唯一的名称才能使其工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14193335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档