WPF将子控件的ActualWidth和ActualHeight传递给值转换器

时间:2019-03-03 13:00:03

标签: wpf data-binding

我希望使用WPF为集合中的每个数据集创建一个图像,并显示垂直堆叠的图像。所有图像必须具有相同的高度(和宽度)。堆叠在一起的图像必须构成包含元素的高度。不得以任何方式拉伸图像。

我所追求的那种不起作用的假装例子如下。

<UniformGrid Columns="1" DataContext="{Binding DataSetCollection}">
    <UniformGrid.Children>
        <MultiBinding Converter="{StaticResource DataSetToImageConverter}">
            <Binding />
            <Binding Path="ActualWidth" RelativeSource="{RelativeSource AncestorType={x:Type UniformGridRow}}" />
            <Binding Path="ActualHeight" RelativeSource="{RelativeSource AncestorType={x:Type UniformGridRow}}" />
        </MultiBinding>
    </UniformGrid.Children>
</UniformGrid>

由于多种原因,此方法不起作用,但希望能传达意图。关键要求是:

  • 所有孩子的身高必须相同
  • 不允许伸展
  • 每个图像都是根据其可用区域动态创建的
  • 当包含元素的大小更改时,图像将重新绘制
  • 用于正确返回图像的值转换器接收包含行的宽度和高度

它不必使用UniformGrid,可以是任何东西,但是它应该为每个孩子使用数据绑定和转换器。

1 个答案:

答案 0 :(得分:0)

这可以解决问题,将其绑定到包含ContentPresenter的大小。

<ItemsControl ItemsSource="{Binding DataSetCollection}" ItemTemplate="{StaticResource WriteableBitmapDataTemplate}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="1" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

使用此数据模板

<DataTemplate x:Key="WriteableBitmapDataTemplate">
    <Image>
        <Image.Source>
            <MultiBinding Converter="{StaticResource RangeToWritableBitmapConverter}">
                <Binding />
                <Binding Path="ActualWidth" RelativeSource="{RelativeSource AncestorType={x:Type ContentPresenter}}" />
                <Binding Path="ActualHeight" RelativeSource="{RelativeSource AncestorType={x:Type ContentPresenter}}" />
            </MultiBinding>
        </Image.Source>
    </Image>
</DataTemplate>