2011-03-02 22 views
4

我可以在鼠标事件处理程序上放置一个线程吗?我可以将鼠标事件处理程序放在单独的线程上吗?

Calls_Calls.MouseUp += new MouseEventHandler(Calls_Calls_MouseUp); 

如何在此添加一个线程?

+0

为什么在这个世界上你想要这样做? 10次​​中有9次,所有的GUI工作都应该在一个线程上完成。通过将'MouseUp'事件处理程序移动到单独的线程来解决什么问题? – 2011-03-02 10:27:22

+0

@CodyGray我认为,由于鼠标事件和UI在同一个线程中,所以在激烈的图形程序中,当您平移或缩放时,鼠标事件被留下。或者我错了。我目前正在努力解决这个问题http://stackoverflow.com/questions/27584324/slow-pan-and-zoom-in-wpf?noredirect=1#comment43602704_27584324 – Vahid 2014-12-21 15:28:14

回答

3

我会成立以同样的方式在事件处理程序,但在Calls_Calls_MouseUp方法,你可以启动一个线程做的工作:

private void Calls_Calls_MouseUp(object sender, MouseEventArgs e) 
{ 
    ThreadPool.QueueUserWorkItem(state => { 
     // do the work here 
    }); 
} 

不过,我通常会尝试让我的事件处理程序是不知道的可能,只是调用一些其他的方法,往往是根据一些条件:

private void Calls_Calls_MouseUp(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     DoSomething(); 
    } 
} 

private void DoSomething() 
{ 
    ThreadPool.QueueUserWorkItem(state => { 
     // do the work here 
    }); 
} 

这使您能够触发完全相同的行为的能力从以外的东西某个控件上的事件(以便您可以在菜单项,工具栏按钮和常规命令按钮上具有相同的行为)。它也可能开放对功能进行单元测试的可能性(尽管异步代码有点棘手)。

+0

我得到'调用线程不能访问这个对象,因为不同的线程拥有它。“错误。可能是什么问题呢? 'ThreadPool.QueueUserWorkItem(州=> { MousePos.Current = e.GetPosition(窗口); 如果(Window.IsMouseCaptured)回报; 变种TT = GetTranslateTransform(窗口);! 变种V =开始 - e.GetPosition (this); tt.X = Origin.X -vX; tt.Y = Origin.Y - vY; });' – Vahid 2014-12-21 15:34:47

+1

@Vahid问题是,您试图从非UI操作UI组件-线。下面是如何解决这个问题:http://stackoverflow.com/a/872815/93623 – 2014-12-22 12:05:15

+0

谢谢弗雷德里克,我遇到了一个非常棘手的问题,这就是为什么我在上面的评论中问了上面的一个问题,或许你可能知道它是什么.http://stackoverflow.com/questions/27584324/slow-pan-and-zoom-in-wpf/27592246?noredirect = 1#comment43611472_27592246 – Vahid 2014-12-22 12:08:31

1
Calls_Calls.MouseUp+= new MouseEventHandler(delegate(System.Object o, System.EventArgs e) { new Thread(Calls_Call_MouseUp).Start(); }); 

应该为你工作。如果你得到括号错误,解决这些问题,因为我handwrote代码:) :)

+0

我有发送者和e :)的标识符预期错误。你能告诉我如何解决它们吗? – elisa 2011-03-02 10:31:33

+0

感谢MSDN的固定代码 – 2011-03-02 10:34:46

1

您也可以使用BackgroundWorker,以防您需要在UI上进行任何更新以获得进度和完成。

相关问题