0

我有一个包含多列的 DataGrid。在其中一个内列中,我正在显示图像。这个图像需要旋转,所以我TransformGroup根据需要使用了 a 来缩放和旋转图像。

如果我不旋转,使用以下 XAML,图像会正常显示。当我更改图像列的宽度时,图像会按预期缩放。它保持在其列的范围内:

<GridViewColumn Header="Image" Width="200" x:Name="image_column">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <Image Source="{Binding Path=ImagePath}" Margin="5">
            </Image>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

现在,如果我尝试在图像列中根据需要旋转图像,事情就会变得很奇怪。列仍然与未旋转的图像宽度相关联,而行高与未旋转的图像高度相关联。该图像还侵入了其左侧邻居的空间。这是我尝试过的一种 XAML 变体:

<GridViewColumn Header="Image" Width="200" x:Name="image_column">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <Image Source="{Binding Path=ImagePath}" Margin="5">
                <Image.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform ScaleX="0.8" ScaleY="0.8" />
                        <RotateTransform Angle="90" CenterX="0" CenterY="0" />
                        <TranslateTransform X="{Binding ElementName=image_column, Path=Width}" />
                    </TransformGroup>
                </Image.RenderTransform>
            </Image>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

上面的 TranslateTransform 是一个完整的技巧,至少使图像的右边缘与其列的右边缘对齐。

我试图添加一个 Viewbox,认为它会按照我想要的方式缩放,并在其中旋转图像,但这不起作用。

谁能告诉我我在这里根本缺少什么,并提供有关如何解决解决方案的提示?此时我唯一的想法是在显示之前旋转图像并保存到磁盘。

4

1 回答 1

1

您应该设置LayoutTransform属性而不是RenderTransform.

<Image.LayoutTransform>
    <TransformGroup>
        <ScaleTransform ScaleX="0.8" ScaleY="0.8"/>
        <RotateTransform Angle="90"/>
    </TransformGroup>
</Image.LayoutTransform>

由于列宽是固定的,ScaleTransform 似乎是多余的。

<Image.LayoutTransform>
    <RotateTransform Angle="90"/>
</Image.LayoutTransform>
于 2013-03-08T16:50:59.477 回答