アイテムのコレクション全体を表示するために必要な寸法を決定しようとしていますが、画面にレンダリングしていません。
ほとんどの場合、既知の固定幅がありますが、高さを動的に変更する必要があります。これまでの戦略は、コード ビハインドで同様のコントロールをインスタンス化し、幅を設定し、Measure/Arrange を呼び出し、結果の ActualHeight を使用することでした。この (臭い) 戦略は比較的うまく機能していますが、グリッド共有サイズ スコープを使用しようとするとうまくいかないようです。
このコードは、理論的には、StackPanel に複数のアイテムを表示するために必要な高さを教えてくれるはずです。
var panel = new StackPanel();
Grid.SetIsSharedSizeScope(panel, true);
panel.Width = this.Width;
foreach (var item in this.Items)
{
var presenter = new ContentPresenter
{
Content = item,
ContentTemplate = <<code to fetch the data template resource>>
};
panel.ApplyTemplate();
panel.Children.Add(presenter);
}
// this doesn't seem to help: panel.UpdateLayout();
panel.Measure(new Size(this.Width, Double.PositiveInfinity));
panel.Arrange(new Rect(panel.DesiredSize));
return panel.ActualHeight;
データ テンプレートは、共有サイズ グループを確実に利用します。
<DataTemplate ...>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="MedCol0" />
<ColumnDefinition Width="Auto" SharedSizeGroup="MedCol1" />
<ColumnDefinition Width="Auto" SharedSizeGroup="MedCol2" />
<ColumnDefinition Width="Auto" SharedSizeGroup="MedCol3" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Name}" />
<TextBlock Grid.Column="1" Text="{Binding StartDate}" />
...
<TextBlock Grid.Column="4" Text="{Binding Comments}" TextWrapping="Wrap" />
</DataTemplate>
また、XAML を介して UI に表示される場合も、正常に動作します。
<ItemsControl Grid.IsSharedSizeScope="True" ItemsSource="..." ItemTemplate="..." />
何かが画面にレンダリングされる前に ActualHeight を評価するために手動でパネルを作成すると、コード ビハインドでは機能しません。
なんらかの理由で、ブレークポイントを設定して各グリッド列の ActualWidth を見ると、行ごとに変化します。このコードで共有サイズ スコープが機能しない理由がわかりません。何か案は?レイアウトを更新するために他の WPF メソッドを呼び出す必要がありますか?