在我的WPF应用程序中,我想要旋转放置在网格单元格中的图像:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Name="btnRotate" Click="btnRotate_Click">Rotate</Button>
<Image Grid.Row="1" Name="img" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />
</Grid>
我尝试了两个想法:
RotateTransform
容器上使用Image
。遗憾的是,此转换会取消容器的属性VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
,并且图像超出了单元格边框。RotateTransform
图片实例上使用TransformedBitmap
。这个结构可以完美地旋转和自动旋转,但GC不会收集旧实例;所以它浪费了很多RAM功能。这是我的第二个想法背后的代码。如果它不会浪费那么多RAM,那就没关系了。
private void btnRotate_Click(object sender, RoutedEventArgs e)
{
bmp = new TransformedBitmap(bmp, new RotateTransform(90));
bmp.Freeze();
img.Source = bmp;
}
那么,在布局容器中使用自动缩放旋转图像的最佳做法是什么?
答案 0 :(得分:1)
您可以尝试使用LayoutTransform而不是RenderTransform。在WPF已经计算出各个对象的所有大小,位置和度量之后,RenderTransform中的转换将被应用,而LayoutTransform组中的转换将在WPF执行所有这些计算之前应用。
答案 1 :(得分:0)
要旋转图像,最好的方法是让WPF完成工作并使用LayoutTransform。
在XAML中,您必须使用Rotation信息添加Image.LayoutTranform标记:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Name="btnRotate" Click="btnRotate_Click">Rotate</Button>
<Image Grid.Row="1" Name="img" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<Image.LayoutTransform>
<RotateTransform Angle="0"/>
</Image.LayoutTransform>
</Image>
</Grid>
在C#中,您现在可以更改点击操作中的旋转:
private void btnRotate_Click(object sender, RoutedEventArgs e)
{
double rotation = (double)img.LayoutTransform.GetValue(RotateTransform.AngleProperty);
rotation += 90;
img.LayoutTransform.SetValue(RotateTransform.AngleProperty, rotation % 360);
}