如何绑定网格行高?

时间:2011-11-30 12:40:43

标签: c# .net wpf xaml data-binding

我有两个相同的分区网格:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Button Grid.Row="0" />
    <Button Grid.Row="2" />
    <GridSplitter Grid.Row="1" Height="4" HorizontalAlignment="Stretch" />
</Grid>

如何让它们同步调整大小?因此,两个网格的行高将相同。

3 个答案:

答案 0 :(得分:2)

您需要使用Shared Size Groups。将属性SharedSizeGroup="some_label"添加到要同步调整大小的行或列定义。

此外,您需要为包含两个网格的某个容器定义Grid.IsSharedSizeScope="true"(在您的情况下为选项卡控件)。

答案 1 :(得分:1)

看起来我可以通过简单的绑定来做到这一点:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="{Binding Path=MySize, Mode=TwoWay}" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Button Grid.Row="0" />
    <Button Grid.Row="2" />
    <GridSplitter Grid.Row="1" Height="4" HorizontalAlignment="Stretch" />
</Grid>

MySize在哪里

private GridLength mySize;
public GridLength MySize
{
    get { return mySize; }
    set
    {
        if (mySize == value) return;
        mySize = value;
        OnPropertyChanged("MySize");
    }
}

注意: Mode = TwoWay,因为与其他conrols不同,RowDefinition不会将其模式默认为TwoWay

答案 2 :(得分:0)

我认为实现这一目标的唯一方法是以编程方式:

XAML 的两个网格中注册Gridsplitter的DragCompleted事件,并为每个网格命名:

<GridSplitter DragCompleted="GridSplitter_DragCompleted1" Grid.Row="1" Height="4" HorizontalAlignment="Stretch" />

CodeBehind 中同步RowDefinitions的高度。由于grisplitter仅影响附加行/列的Row / ColDefinitions,因此我们必须在此处同步rowdefinitions。做其他事情,比如设置gridsplitters位置是行不通的。

private void GridSplitter_DragCompleted1(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
  SyncRowDefinitions(Grid1, Grid2);
}

private void GridSplitter_DragCompleted2(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
  SyncRowDefinitions(Grid2, Grid1);
}


private void SyncRowDefinitions(Grid sourceGrid, Grid targetGrid)
{
  for (int i = 0; i < sourceGrid.RowDefinitions.Count; i++)
  {
    targetGrid.RowDefinitions[i].Height = sourceGrid.RowDefinitions[i].Height;
  }
}

编辑:如果需要,您也可以在其最初加载后的其他出现状态(例如整个网格的大小)中同步网格,依此类推...