Кажется, есть небольшая проблема с двумя сетками, содержащими элементы, определенные определенным образом, и SharedSizeGroup.
Этот вопрос является ответом на более ранний вопрос от пользователя D.H. Я попытался ответить. Простите за длину, но это помогает наглядно продемонстрировать проблему.
В его первоначальном вопросе спрашивалось, почему две сетки с SharedSizeGroup не меняли размер до одной высоты при выполнении определенных условий (изменение размера TextBlock в правой сетке). Я взял его пример и расширил его, потому что подозревал, что это связано с циклом «Измерить / Расположить».
Оказывается, это на самом деле имеет отношение к Измерению и Расстановке. На самом деле, это связано с тем, что не выполняет Меру. Я чувствую, что это может быть по крайней мере проблемой, если не ошибкой, но хотел бы получить объяснение поведения.
Вот краткий обзор того, что происходит (яркие цвета только для демонстрационных целей).
Запуск
Обе сетки имеют три строки, каждая из которых содержит TextBlock. Средний ряд имеет SharedSizeGroup. Текст средней строки привязан к ActualHeight его TextBlock, с начальным свойством Height, жестко запрограммированным для значений, которые вы видите. Числа под сетками представляют фактическую высоту этой сетки. Обратите внимание, что BackgroundColor левой сетки имеет зеленый цвет.

Увеличение правого текстового блока
Когда правая сетка увеличивается в размере, вы можете видеть, что обе сетки изменяют размер до новой высоты, благодаря SharedSizeGroup. Столбец справа отражает вызовы Measure и Arrange сеток.

Уменьшение текстового блока справа, но больше, чем текстового блока слева
Когда сетка правой стороны уменьшается в размере, но все же превышает размер жестко закодированного текстового блока левой стороны, вы можете видеть, что обе сетки снова изменяют размер до новой высоты, благодаря SharedSizeGroup. Столбец справа отражает вызовы Measure и Arrange сеток.

Уменьшение текстового блока справа меньше размера левого текстового блока
Когда сетка с правой стороны уменьшается в размере, меньше, чем размер жестко закодированного TextBlock левой стороны, вы можете видеть, что сетка с левой стороны не уменьшается до «правильного» размера, о чем свидетельствует наблюдение Зеленый фон сетки внизу, а также тот факт, что размер сетки равен 150, а не 130.
Если вы посмотрите на информацию справа, вы заметите, что левая сетка сделала Arrange, но не сделал измерение.

Вот пример кода для дублирования проблемы.
Классы InfoGrid и InfoGridEventArgs
using System.Windows;
using System.Windows.Controls;
namespace GridMeasureExample
{
class InfoGrid : Grid
{
protected override Size ArrangeOverride(Size arrangeSize)
{
CallReportInfoEvent("Arrange");
return base.ArrangeOverride(arrangeSize);
}
protected override Size MeasureOverride(Size constraint)
{
CallReportInfoEvent("Measure");
return base.MeasureOverride(constraint);
}
public event EventHandler<InfoGridEventArgs> ReportInfo;
private void CallReportInfoEvent(string message)
{
if (ReportInfo != null)
ReportInfo(this, new InfoGridEventArgs(message));
}
}
public class InfoGridEventArgs : EventArgs
{
private InfoGridEventArgs()
{
}
public InfoGridEventArgs(string message)
{
this.TimeStamp = DateTime.Now;
this.Message = message;
}
public DateTime TimeStamp
{
get;
private set;
}
public String Message
{
get;
private set;
}
}
}
Главное окно XAML
<Window x:Class="GridMeasureExample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:GridMeasureExample"
Title="SharedSizeGroup" Height="500" Width="500">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel Grid.Column="0"
Grid.Row="0"
Orientation="Horizontal"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Grid.IsSharedSizeScope="True">
<StackPanel Orientation="Vertical" Width="100">
<local:InfoGrid x:Name="grid1" Background="Green" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="15" />
<RowDefinition SharedSizeGroup="Group1" />
<RowDefinition Height="15" />
</Grid.RowDefinitions>
<TextBlock Background="Blue" Grid.Row="0" Text="Row 0"/>
<TextBlock Background="Red" Grid.Row="1" Name="textBlock1" Height="100"
Text="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"/>
<TextBlock Background="Blue" Grid.Row="2" Text="Row 2" />
</local:InfoGrid>
<TextBlock Text="{Binding Path=ActualHeight, ElementName=grid1}" />
</StackPanel>
<StackPanel Orientation="Vertical" Width="100">
<local:InfoGrid x:Name="grid2" Background="Yellow" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="15" />
<RowDefinition SharedSizeGroup="Group1" />
<RowDefinition Height="15" />
</Grid.RowDefinitions>
<TextBlock Background="Orange" Grid.Row="0" Text="Row 0" />
<TextBlock Background="Purple" Grid.Row="1" Name="textBlock2" Height="150"
Text="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight}"/>
<TextBlock Background="Orange" Grid.Row="2" Text="Row 2" />
</local:InfoGrid>
<TextBlock Text="{Binding Path=ActualHeight, ElementName=grid2}" />
</StackPanel>
</StackPanel>
<ListBox x:Name="lstInfo"
Grid.Column="1"
Grid.Row="0"
Margin="10,0,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" />
<UniformGrid Grid.Column="0"
Grid.Row="1"
Grid.ColumnSpan="2"
Columns="2"
HorizontalAlignment="Center"
Margin="5">
<Button x:Name="btnIncrease" Margin="4,0">Increase</Button>
<Button x:Name="btnDecrease" Margin="4,0">Decrease</Button>
</UniformGrid>
</Grid>
</Window>
Конструктор главного окна (только код с выделенным кодом)
public Window1 ()
{
InitializeComponent (); * * тысяча шестьдесят шесть
btnIncrease.Click += (s, e) =>
{
lstInfo.Items.Add(String.Format("{0} Increase Button Pressed", DateTime.Now.ToString("HH:mm:ss.ffff")));
textBlock2.Height += 30;
};
btnDecrease.Click += (s, e) =>
{
lstInfo.Items.Add(String.Format("{0} Decrease Button Pressed", DateTime.Now.ToString("HH:mm:ss.ffff")));
if (textBlock2.ActualHeight >= 30)
textBlock2.Height -= 30;
};
grid1.ReportInfo += (s, e) => lstInfo.Items.Add(String.Format("{0} Left Grid: {1}", e.TimeStamp.ToString("HH:mm:ss.ffff"), e.Message));
grid2.ReportInfo += (s, e) => lstInfo.Items.Add(String.Format("{0} Right Grid: {1}", e.TimeStamp.ToString("HH:mm:ss.ffff"), e.Message));
}