我有以下XAML代码:
<Grid Background="Blue">
<Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown">
<CheckBox MouseLeftButtonDown="CheckBox_MouseLeftButtonDown_1"></CheckBox>
</Grid>
</Grid>
当我单击鼠标左键的复选框时,不会触发声明的事件。 任何人都可以解释这种行为吗? 提前致谢
答案 0 :(得分:5)
事件由其他事件处理(可能由Checked
事件消耗)。
如果您将事件更改为PreviewMouseLeftButtonDown
(MouseLeftButtonDown
的隧道版),则会正常启动。
答案 1 :(得分:2)
CheckBox继承自ButtonBase,它为左按钮事件(OnMouseLeftButtonDown)添加了一个类处理程序。正如UIElement.MouseLeftButtonDown事件提及的文档(强调我的):
某些控件类可能有 鼠标的固有类处理 按钮事件。鼠标左键 down事件是最有可能发生的事件 在控件中进行类处理。该 班级处理往往标志着 基础Mouse类事件为 处理。一旦事件被标记 处理,其他实例处理程序 附加到该元素不是 通常提出。任何其他类或 附加到的实例处理程序 冒泡方向的元素 朝向UI树中的根是 通常也不会提高。
您可以使用ClickMode并将其设置为ClickMode.Hover,这似乎可以防止您看到的行为。但是,您可能必须在此特定实例的事件处理程序中维护自定义逻辑,以设置复选框的正确切换状态。
您还可以尝试使用PreviewMouseLeftButtonDown事件。但是,在处理程序中标记该事件可能会对其余的MouseDown事件产生副作用 - 它们将携带处理的信息,这将阻止其他实例处理程序,除非它们与AddHandler一起添加,并带有用于处理已处理事件的标志。
答案 2 :(得分:0)
Franci感谢您的回复......我需要复选MouseLeftDownEvent来解雇,设置clickMode = hover解决了我的问题。我需要MouseleftDownEvent将事件冒泡到父网格。