因为 UI 事件采用的单线程模型。
我想不用DoEvents这个方法 该怎么解决这个问题
其实我很想要一个MouseHover事件 可惜没有
@溪山行旅丶: 你告诉我你想做什么,然后我告诉你如何实现。
@Launcher: 没什么 只是在code着玩的时候遇到这个问题 你就在MouseDown里面放一个While循环比如
bool k= true; int kk=1; void MouseDown(..) { While(k) { kk++ } } void MouseUp(..) { k=false; }
要触发MouseUp事件,不用DoEvents和多线程
@溪山行旅丶: 我以为你想实现在窗体上画移动的十字光标,同时显示鼠标位置坐标的功能。看来我错了,你只是玩玩,我玩不起,不奉陪了。
@Launcher: 汗
你这种是无解的,虽然C#是面向对象语言,但是根本还是面向过程的啊。你都不让他消息循环执行,他就会一直卡在你的死循环里的
这个是线程的问题,MouseDown里执行的代码是跟UI的事件处理是在同一个线程里的。
线程,顾名思义,程序向一条线一样执行,一个步骤执行完了才执行下一个步骤。你用while循环,循环没结束是不会执行UI事件处理的,所以不会触发MouseUp事件。
要解决这个问题很简单。那就是再建一个线程来跑While循环,就像一个人只能同时做一件事,两个人就可以同时做两件事了。
怎么新建线程参照MSDN:Thread
有两个线程后,还要注意跨线程的问题,就像两个人都在干活,他们很可能会互相干扰。这就涉及到多线程同步的问题。
在WPF中非UI线程去更改UI会报异常,这时可以用当前UI的Dispatcher来处理。
Dispatcher.BeginInvoke()