我正在尝试确定完整显示项目集合所需的尺寸 - 但未将其呈现在屏幕上。
在大多数情况下,我们有一个已知/固定的宽度,但需要动态更改高度。到目前为止,策略一直是在代码隐藏中实例化类似的控件,设置宽度,调用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方法来更新布局?