WPF复选框控件不响应鼠标左键按下事件。

4
我有以下的XAML代码:
<Grid Background="Blue">
        <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown">
            <CheckBox MouseLeftButtonDown="CheckBox_MouseLeftButtonDown_1"></CheckBox>
        </Grid>
</Grid>

当我用鼠标左键单击复选框时,声明的事件没有被触发。有人可以解释一下这种行为吗?谢谢。
3个回答

6

该事件正在被其他东西处理(可能正在被Checked事件消耗)。

如果将事件更改为PreviewMouseLeftButtonDownMouseLeftButtonDown的隧道版本),它将正常触发。


2
复选框继承自ButtonBase,为左键按下事件(OnMouseLeftButtonDown)添加了一个类处理程序。正如UIElement.MouseLeftButtonDown事件的文档所述(我强调):
一些控件类可能具有鼠标按钮事件的固有类处理。左鼠标按钮按下事件是控件中最有可能具有类处理的事件。该类处理通常将底层Mouse类事件标记为已处理。一旦事件被标记为已处理,则其他附加到该元素的实例处理程序通常不会被引发。任何其他附加到向根在UI树中冒泡方向的元素的类或实例处理程序也通常不会被引发。
您可以尝试使用ClickMode并将其设置为ClickMode.Hover,这似乎可以防止您看到的行为。但是,您可能需要为此特定实例维护自定义逻辑,以设置复选框的正确切换状态。
您还可以尝试PreviewMouseLeftButtonDown事件。但是,在处理程序中将该事件标记为已处理可能会对其余的MouseDown事件产生副作用-它们将携带已处理信息,这将防止其他实例处理程序,除非它们使用带有处理已处理事件标志的AddHandler添加。

拿了我的想法却没点赞我的回答?太残忍了,弗朗西。 - Charlie
哈哈,@Charlie,你并不拥有PreviewMouseLeftButtonDown事件。它是一个公共事件。:-) 但你先提到了它,所以我给了你点赞(不幸的是,你只能从我这里得到一个)。 - Franci Penov
哈哈,那是正确的,也没什么大不了的。但是你在看完我的帖子后编辑了你的帖子来包含它。 :) - Charlie

0

Franci,谢谢你的回复...我需要勾选MouseLeftDownEvent才能触发事件,并且设置clickMode = hover解决了我的问题。我需要MouseleftDownEvent将事件冒泡到父网格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接