应用IsSharedSizeScope确定代码隐藏中的网格StackPanel的ActualHeight

时间:2015-02-06 20:13:06

标签: c# wpf issharedsizescope

我正在尝试确定完整显示项目集合所需的尺寸 - 但未将其呈现在屏幕上。

在大多数情况下,我们有一个已知/固定的宽度,但需要动态更改高度。到目前为止,策略一直是在代码隐藏中实例化类似的控件,设置宽度,调用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方法来更新布局?

0 个答案:

没有答案