将绘制的圆移动到C#WPF中的固定位置
本文关键字:定位 C#WPF 位置 绘制 移动 | 更新日期: 2023-09-27 18:25:16
我想通过单击按钮来移动圆圈。例如
在(0,0)的位置上有一个圆圈,我想通过点击X+按钮来移动它。这将在不停止的情况下逐个增加X,并在X位置上移动圆。然后,当我点击Y+按钮时,它将使Y增加20倍,圆也开始在Y轴上移动。
我有一个代码,但我不能动态地移动它。它移动到预定义的位置。
XAML:
<Window x:Class="circle_animation.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded" Closed="Window_Closed" >
<Canvas>
<Ellipse Width="10" Height="10" Canvas.Left="0" Canvas.Top="0" Fill="Black" x:Name="el" />
<Button Canvas.Left="255" Canvas.Top="266" Content="Move On X" Height="23" Width="75" Click="Button_Click" />
<Button Canvas.Left="139" Canvas.Top="272" Content="Move On Y+" Height="23" Name="button1" Width="75" Click="Button2_Click" />
</Canvas>
代码:
public int X;
public int Y;
public bool inside = true;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
if (inside)
{
DoubleAnimation animatex = new DoubleAnimation();
animatex.To = X;
el.BeginAnimation(Canvas.LeftProperty, animatex);
DoubleAnimation animatey = new DoubleAnimation();
animatey.To = Y;
el.BeginAnimation(Canvas.TopProperty, animatey);
}
}
public void Button_Click(object sender, RoutedEventArgs e)
{
if (inside)
{
X++;
}
}
public void Button2_Click(object sender, RoutedEventArgs e)
{
Y = Y + 20;
}
这是我的想法,动态地移动它,但它不起作用。你能帮我吗?我哪里做错了?
您在这里混淆了一些事情。
首先,动画不会因为没有设置其持续时间而永远运行。相反,DoubleAnimation的默认持续时间为1秒,然后停止。
其次,动画的To
属性不会因为更改了预先指定给它的变量而神奇地更改。在动画启动后,对其属性的更改将被忽略。
我认为使用动画是解决问题的错误方法。您想要实现的目标(具有可变速度矢量的连续移动对象)可能最好通过使用DispatcherTimer并根据经过的时间循环更新对象的位置来实现。
下面的示例代码可能会让您了解这是如何工作的。现在,您可以随心所欲地更改速度矢量(通过单击一些按钮来设置speed.X
和speed.Y
),对象将相应地移动。一种可能的优化方法是不立即启动计时器,而是仅在矢量变为非零时启动,并在速度变为零时再次停止计时器。
private DispatcherTimer timer = new DispatcherTimer(); // timer object
private Vector speed = new Vector(0, 0); // movement in pixels/second, initially zero
public MainWindow()
{
InitializeComponent();
timer.Interval = TimeSpan.FromMilliseconds(50); // update 20 times/second
timer.Tick += TimerTick;
timer.Start();
}
private void TimerTick(object sender, EventArgs e)
{
// movement in one interval
double dx = speed.X * timer.Interval.TotalSeconds;
double dy = speed.Y * timer.Interval.TotalSeconds;
// update position
Canvas.SetLeft(el, Canvas.GetLeft(el) + dx);
Canvas.SetTop(el, Canvas.GetTop(el) + dy);
}