如何绑定网格行高?

3

我有两个带分割器的相同网格:

<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>

如何使它们同步调整大小?这样,两个网格的行高将相同。

它们是否相邻? - Steven Jeuris
它们位于TabControl的不同选项卡上。 - Poma
3个回答

2
你需要使用共享大小组。将属性SharedSizeGroup="some_label"添加到你想要同步调整大小的行或列定义中。
此外,你需要为一些容器定义Grid.IsSharedSizeScope="true",该容器包含两个网格(在你的情况下是选项卡控件)。

2
可能相关:(https://dev59.com/8m445IYBdhLWcg3w3Nwf):参与大小共享的列和行不遵守星号大小调整。在大小共享场景中,星号大小调整被视为自动调整。 - Steven Jeuris
它的行为也相当奇怪。当我调整第一个选项卡中的行大小时,我无法使其在其他选项卡中的大小小于第一个选项卡中的大小。 - Poma
我发现这是一个bug,在我的情况下使这个功能完全无用:https://connect.microsoft.com/VisualStudio/feedback/details/509801/wpf-sharedsizegroup-gridsplitter-bug - Poma
还有其他建议吗?也许将它们绑定到一些常见的DependencyProperty上? - Poma
@Poma绑定Mode=TwoWay,UpdateSourceTrigger=PropertyChanged应该可以正常工作。只是不要忘记在属性setter内引发PropertyChanged事件,否则第二个网格将不会更新。 - Dmitry

2

看起来我可以通过简单的绑定来实现:

<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");
    }
}

注意: 由于与其他控件不同,RowDefinition不会将其模式默认为TwoWay,因此需要Mode=TwoWay。


0
我认为唯一实现这个的方式是通过编程:
在XAML中注册两个网格拆分器的DragCompleted事件,并为每个网格命名:
<GridSplitter DragCompleted="GridSplitter_DragCompleted1" Grid.Row="1" Height="4" HorizontalAlignment="Stretch" />

在CodeBehind中同步RowDefinitions的高度。由于gridsplitter仅影响附加行/列的Row/ColDefinitions,因此我们必须在此处同步rowdefinitions。做其他事情,如设置gridsplitter的位置是行不通的。
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;
  }
}

编辑:如果需要,您还可以在其他情况下同步网格,例如在整个网格的大小更改(初始加载后)等情况下...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接