21
|
Edward Tanguay · 技术社区 · 16 年前 |
![]() |
1
25
事件会冒泡,直到它被处理… 由于该按钮通过鼠标单击来执行某些操作,因此它会吸收鼠标事件并将其转换为ClickEvent。 如果使用PreviewMouseDown,您会看到StackPanel在按钮之前首先接收到事件。预览事件使用隧道向下方法。 |
![]() |
2
8
正如其他人所说,这是因为
一种解决方案是
如果在某个地方执行此操作而不是在XAML中设置mousedown处理程序:
你会收到所有
|
![]() |
3
7
此外,如果希望stackpanel接收事件,请将stackpanel xaml更改为:
活动签名:
在这种情况下,StackPanel将接收按钮的Click事件。但是,单击stackpanel本身不会触发任何事件,因为它专门监听按钮单击。 |
![]() |
4
2
因为所有的信息都被捕获了
编辑: Edward Tanguay(OP)对这个答案发表了评论,我正在这里复制他的评论,因为它非常相关:
你是对的。按钮未处理MouseDown事件,因为在该控件上没有为其指定处理程序ha。 但是,老鼠镇在某种程度上是特别的。至少在Windows窗体中,它用于启动绘图和拖动操作,因此当控件获取事件时,它将继续捕获所有后续鼠标消息,即使您没有为其定义处理程序。当控件将Capture属性设置为true时,就会执行此陷阱,这样可以有效地阻止后续事件冒泡。当获取mouseup事件时,Windows窗体会将Capture属性设置回false。 我重复一遍,这就是它在Windows窗体中的工作方式,您可能需要再次检查这个,但是,imho没有任何理由说明WPF的情况应该有所不同。 参考:请参阅“Windows窗体处理”部分 http://blogs.msdn.com/jfoscoding/archive/2005/07/28/444647.aspx (从页面中间稍微向下滚动)。 注:有关气泡和隧道事件引发序列的参考,请参阅我对Arcturu答案的评论。 |
![]() |
5
2
button事件禁止mousedown和mouseup,因为button事件是高级事件,并且有一些代码赋予flag handle true。为了解决此问题,禁止mousedown。可以将此代码添加到window的构造函数中。
|