如何在鼠标单击时更改wpf中的窗口位置

时间:2015-09-29 13:32:44

标签: c# wpf

我需要在鼠标点击时更改窗口的位置。 这是代码。

private void Button_Click(object sender, RoutedEventArgs e)
{
    for(int i=0; i<50; i++)
    {
        this.Top -= i; 
        this.Left -= i;
    } 
}

但每当我运行此程序时,只会显示最后一个位置。我的目的是将其连续移动到循环结束。

3 个答案:

答案 0 :(得分:2)

最后我自己找到了答案。它像我预期的那样完美地工作。我使用了SynchronizationContext,它可以发布Actions以更新UI线程上的控件。

    public partial class Splash : Window
    {
        SynchronizationContext sc;
        System.Timers.Timer t;
        double i=0;
        double tempTop;
        double angle = 0;
        public Splash()
        {
            InitializeComponent();
            sc=SynchronizationContext.Current;
        }
        private void Move(object sender, MouseEventArgs e)
        {
            DragMove();
        }

        private void btnClose_Click(object sender, RoutedEventArgs e)
        {
            Application.Current.Shutdown();
        }

        private void btnMinim_Click(object sender, RoutedEventArgs e)
        {
            this.WindowState = WindowState.Minimized;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {

                l1.Content = "Helicopter Moving";
            if(t!=null)
            {
                t.Stop();
                t.Dispose();
            }
                //for (double i = 0; i < 1; i += 0.05)
                //{
                //    this.Top -= i;
                //    this.Left -= i;
                //    Thread.Sleep(100);
                //}
                //l1.Content = "Helicopter Stopped";
                tempTop = this.Top;
                t = new System.Timers.Timer();
                t.Interval = 10;
                t.Enabled = true;
                t.Elapsed += Change;
                t.Start();

        }
        void Change(object sender, EventArgs e)
        {
            if (i <= 3)
            {
                sc.Post(o =>
                {
                    this.Top = tempTop * (Math.Cos(Math.PI * angle / 180));
                    this.Left -= i;
                    angle = (angle >= 360) ? 0 : ++angle;
                    i = i + 0.01;
                }, null);
            }
            else
            {
                t.Stop();
                i = i * -1;
            }

        }
    }
}

答案 1 :(得分:1)

尝试这应该工作Thread.Sleep不适合你作为它的UI线程。你需要计时器来完成这项工作

Timer t; 
private void Button_Click(object sender, RoutedEventArgs e)
{

    i=0;
    if(t!=null)
    { 
       t.Stop();
       t.Dispose();
    }
    t = new Timer();
    t.Interval = 800;
    t.Enabled = true;
    t.Tick += T_Tick;
    t.Start();                                                    

}
int i=0;
private static void T_Tick(object sender, EventArgs e)
{
   if(i<=50)
   {
        this.Top -= i; 
        this.Left -= i;
        i++;
    }
    else
     t.Stop();   
}        

答案 2 :(得分:0)

只需在点击事件触发时启动动画即可。您可以定义动画的持续时间。

使用动画而不是手动进行计算的基本好处是动画在分离的线程中运行,因此您不会失去应用程序的响应能力。
此外,您可以在分离的工具中编辑动画,例如Blend,而无需在运行时验证动画。

很少有消息来源: http://www.wpf-tutorial.com/styles/trigger-animations-enteractions-exitactions/ http://dotnetslackers.com/articles/wpf/IntroductionToWPFAnimations.aspx http://www.wpftutorial.net/Animation.html