我有以下自定义UserControl
代表我的应用程序中的卡片:
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:Core="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Namespace="clr-namespace:MyApp" xmlns:Properties="clr-namespace:MyApp.Properties" Core:Class="MyApp.Card" Height="176" RenderTransformOrigin="0.5,0.5" Width="83" UseLayoutRounding="True">
<UserControl.LayoutTransform>
<TransformGroup>
<RotateTransform/>
<ScaleTransform/>
</TransformGroup>
</UserControl.LayoutTransform>
<UserControl.RenderTransform>
<TransformGroup>
<RotateTransform/>
<ScaleTransform/>
</TransformGroup>
</UserControl.RenderTransform>
<UserControl.Resources>
<Namespace:ImagesConverter Core:Key="ImagesConverter"/>
</UserControl.Resources>
<Canvas Core:Name="Layout">
<Image Core:Name="Image" HorizontalAlignment="Left" Source="{Binding Source={Core:Static Properties:Resources.Cards}, Converter={StaticResource ImagesConverter}}" Stretch="None" VerticalAlignment="Top">
<Image.Clip>
<RectangleGeometry Core:Name="Clipping" Rect="0,0,83,176"/>
</Image.Clip>
<Image.RenderTransform>
<TranslateTransform Core:Name="Translation" X="0" Y="0"/>
</Image.RenderTransform>
</Image>
<Rectangle Core:Name="Highlight" Canvas.Left="-2" Canvas.Top="-2" Height="180" Opacity="0.7" Stroke="#FFFFF500" StrokeThickness="3" Visibility="Collapsed" Width="87"/>
</Canvas>
</UserControl>
正如你所看到的......我有一个包含所有卡片面的位 PNG 图像,然后,当我在构造函数中创建一个新的卡片传递Suit
和Rank
枚举值时,我计算了正确的裁剪矩形和图像的平移。一切都像一个魅力......除了当我尝试用Storyboard
需要 90° 旋转的卡片为卡片设置动画时。这是我的代码(在Storyboard
中定义MainWindow.Resources
):
<DoubleAnimation BeginTime="00:00:00.4" Duration="00:00:00.2" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(RotateTransform.Angle)" To="90"/>
结果如下:
我不明白发生了什么……但是图像会以某种方式被拉伸并且变得非常模糊,正如您所看到的。我尝试UseLayoutRounding="True"
在我的卡控制以及SnapsToDevicePixels="True"
我MainWindow
在其他地方的建议中使用......但它不起作用!当然......如果我使用LayoutTransform
而不是RenderTransform
一切正常旋转卡片并且卡片不模糊......但我不能让卡片围绕它的中心旋转,我的动画需要从中心旋转 90°。在我看来,为卡片高度的一半加上布局旋转动画Canvas.Top
是一个非常糟糕的解决方案......而且它也让我的动画看起来很糟糕。你能建议我一个解决方案吗?
[编辑] 我尝试使用RenderOptions.BitmapScalingMode="NearestNeighbor"
and RenderOptions.EdgeMode="Aliased"
...但它变得更糟: