Как связать высоту строки сетки? - PullRequest
3 голосов
/ 30 ноября 2011

У меня есть 2 идентичные сетки с разделителями:

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

2 голосов
/ 30 ноября 2011

Вам необходимо использовать Группы общего размера . Добавьте атрибут SharedSizeGroup="some_label" в определения строк или столбцов, размер которых вы хотите изменить синхронно.

Кроме того, вам нужно определить Grid.IsSharedSizeScope="true" для некоторого контейнера, который содержит обе сетки (в вашем случае - вкладка).

1 голос
/ 30 ноября 2011

Похоже, я могу сделать это с помощью простых привязок:

<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 необходим, так как в отличие от других контролов RowDefinition не использует по умолчанию свой режим TwoWay

0 голосов
/ 30 ноября 2011

Я думаю, что единственный способ достичь этого - программно:

Зарегистрируйте событие DragCompleted Gridsplitter в обеих сетках в XAML и присвойте каждой сетке имя:

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

В CodeBehind синхронизируется высота RowDefinitions. Поскольку grisplitter влияет только на определения строк / столбцов прикрепленных строк / столбцов, мы должны синхронизировать здесь определения строк. Другие действия, такие как установка положения гридсплиттеров, не сработают.

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

Редактировать: При необходимости вы можете синхронизировать сетки и в других случаях, например, с изменением размера (всей сетки) после его первоначальной загрузки и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...