我正在尝试学习一些WPF,我希望能够实现一个简单的游戏。在这个游戏中,画布
上有一些项目。就这个问题而言,假设只有一个,它是椭圆
:
<Canvas Name="canvas">
<Ellipse Name="ellipse" Width="100" Height="100" Stroke="Black" StrokeThickness="3" Fill="GreenYellow"/>
</Canvas>
用户需要能够任意拖动这些项目。
因此,我实现了以下代码,它似乎可以工作:
public MainWindow()
{
InitializeComponent();
Canvas.SetLeft(ellipse, 0);
Canvas.SetTop(ellipse, 0);
ellipse.MouseDown += new MouseButtonEventHandler(ellipse_MouseDown);
ellipse.MouseMove += new MouseEventHandler(ellipse_MouseMove);
ellipse.MouseUp += new MouseButtonEventHandler(ellipse_MouseUp);
}
void ellipse_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton != MouseButtonState.Pressed)
return;
ellipse.CaptureMouse();
ellipse.RenderTransform = new ScaleTransform(1.25, 1.25, ellipse.Width / 2, ellipse.Height / 2);
ellipse.Opacity = 0.75;
}
void ellipse_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton != MouseButtonState.Pressed || !ellipse.IsMouseCaptured)
return;
var pos = e.GetPosition(canvas);
Canvas.SetLeft(ellipse, pos.X - ellipse.Width * 0.5);
Canvas.SetTop(ellipse, pos.Y - ellipse.Height * 0.5);
}
void ellipse_MouseUp(object sender, MouseButtonEventArgs e)
{
if (!ellipse.IsMouseCaptured)
return;
ellipse.ReleaseMouseCapture();
ellipse.RenderTransform = null;
ellipse.Opacity = 1;
}
现在,如果你尝试这个,你会发现动作是非常锯齿状的。当鼠标向下移动时,椭圆会立即增长并立即更改其透明度。我想把它弄平,这样就不会有突然的跳跃
我已经在<code>Ellipse.OpacityProperty</code>、<code>ScaleTransform.ScaleXProperty<-code>和(特别是)<code>Canvas上使用了<code>DoubleAnimation</code〕。LeftProperty/TopProperty</code>。然而,我遇到了以下问题:
一旦我在
Canvas上开始动画。LeftProperty/TopProperty
,我就再也不能使用Canvas。SetLeft/Top
了,所以拖动椭圆时不会移动。我找不到从对象中删除动画的方法。如果用户在动画仍在进行时释放鼠标,则
ScaleTransform
上的“收缩”动画会在“增长”动画到达之前从全尺寸开始,从而导致突然跳跃。如果你疯狂地点击鼠标,对象的大小就会疯狂地跳跃,这是不应该的。
如果需要,您可以看看我失败的代码,它不起作用。
如何在WPF中正确实现这些平滑运动
请不要在没有先尝试的情况下发布答案。如果有任何突然的跳跃,结果是不令人满意的。谢谢