首页 新闻 会员 周边

WPF 循环阻塞了事件的触发

0
[已解决问题] 解决于 2015-01-28 11:08
 Button MouseDown事件中一个While循环 直接阻塞了MouseUp事件的触发  用了Winform里面的DoEvents方法才解决   谁能告诉我其中的原因
溪山行旅丶的主页 溪山行旅丶 | 初学一级 | 园豆:6
提问于:2014-06-06 16:48
< >
分享
最佳答案
0

因为 UI 事件采用的单线程模型。

奖励园豆:5
Launcher | 高人七级 |园豆:45045 | 2014-06-06 17:00

我想不用DoEvents这个方法  该怎么解决这个问题

溪山行旅丶 | 园豆:6 (初学一级) | 2014-06-06 17:02

其实我很想要一个MouseHover事件 可惜没有

溪山行旅丶 | 园豆:6 (初学一级) | 2014-06-06 17:03

@溪山行旅丶: 你告诉我你想做什么,然后我告诉你如何实现。

Launcher | 园豆:45045 (高人七级) | 2014-06-06 17:23

@Launcher: 没什么 只是在code着玩的时候遇到这个问题 你就在MouseDown里面放一个While循环比如

bool k= true;
int kk=1;
void MouseDown(..)
{
While(k)
{
kk++
}
}


void MouseUp(..)
{
k=false;
}
要触发MouseUp事件,不用DoEvents和多线程
溪山行旅丶 | 园豆:6 (初学一级) | 2014-06-06 17:29

@溪山行旅丶: 我以为你想实现在窗体上画移动的十字光标,同时显示鼠标位置坐标的功能。看来我错了,你只是玩玩,我玩不起,不奉陪了。

Launcher | 园豆:45045 (高人七级) | 2014-06-06 17:45

@Launcher: 汗

溪山行旅丶 | 园豆:6 (初学一级) | 2014-06-06 19:30
其他回答(3)
0

你这种是无解的,虽然C#是面向对象语言,但是根本还是面向过程的啊。你都不让他消息循环执行,他就会一直卡在你的死循环里的

刘宏玺 | 园豆:14020 (专家六级) | 2014-06-06 20:51
0

这个是线程的问题,MouseDown里执行的代码是跟UI的事件处理是在同一个线程里的。

线程,顾名思义,程序向一条线一样执行,一个步骤执行完了才执行下一个步骤。你用while循环,循环没结束是不会执行UI事件处理的,所以不会触发MouseUp事件。

要解决这个问题很简单。那就是再建一个线程来跑While循环,就像一个人只能同时做一件事,两个人就可以同时做两件事了。

怎么新建线程参照MSDN:Thread

有两个线程后,还要注意跨线程的问题,就像两个人都在干活,他们很可能会互相干扰。这就涉及到多线程同步的问题。

在WPF中非UI线程去更改UI会报异常,这时可以用当前UI的Dispatcher来处理。

德年 | 园豆:810 (小虾三级) | 2014-06-07 18:05
0

Dispatcher.BeginInvoke()

影踪派 | 园豆:317 (菜鸟二级) | 2014-06-09 19:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册