【问题标题】:Moving a drawn circle to settled position in C# WPF在 C# WPF 中将绘制的圆圈移动到固定位置
【发布时间】:2012-02-21 05:53:11
【问题描述】:

我想通过单击按钮来移动圆圈。例如;

(0,0) 的位置有一个圆圈,我想通过单击 X+ 按钮来移动它。这将在不停止的情况下将 X 一一增加,并在 X 位置上循环移动。然后当我点击 Y+ 按钮时,它只会增加 20 倍 Y 并且圆圈也开始在 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;
    }

这是我动态移动它的想法,但它不起作用。你能帮我吗 ?我哪里做错了?

【问题讨论】:

  • 您是否期望圆在不断移动并且通过改变 X 和 Y 来神奇地改变它的“速度矢量”?
  • 是的,正是我想这样做。

标签: c# wpf animation drawing geometry


【解决方案1】:

您在这里混淆了一些事情。

首先,动画不会因为您没有设置其持续时间而永远运行。而 DoubleAnimation 的默认持续时间是 1 秒,然后停止。

其次,动画的To 属性不会因为您更改了预先分配给它的变量而神奇地改变。在动画启动后,无论如何都会忽略对动画属性的更改。

我认为使用动画是解决问题的错误方法。您想要实现的目标(具有可变速度矢量的连续移动对象)可能最好通过使用DispatcherTimer 并根据经过的时间循环更新对象的位置来完成。

以下示例代码可能会让您了解其工作原理。您现在可以随意更改速度矢量(通过单击一些按钮设置speed.Xspeed.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);
}

【讨论】:

  • 此解决方案有效。非常感谢。我刚刚意识到这个椭圆必须有一个像 12 点钟这样的初始度数。当我单击 Y 按钮时,它必须设置度数,然后 X 按钮触发开始在该位置移动..我现在会处理这个...谢谢。我也会问另一个问题。
  • 不客气。请注意,Vector 类有一些对向量算术非常有用的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2021-06-09
相关资源
最近更新 更多