3

我有以下 XAML 代码:

<Grid Background="Blue">
        <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown">
            <CheckBox MouseLeftButtonDown="CheckBox_MouseLeftButtonDown_1"></CheckBox>
        </Grid>
</Grid>

当我用鼠标左键单击复选框时,不会触发声明的事件。谁能解释这种行为?提前致谢

4

3 回答 3

5

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

如果您将事件更改为PreviewMouseLeftButtonDown(的隧道版本MouseLeftButtonDown),它将正确触发。

于 2009-08-25T22:00:00.483 回答
2

CheckBox 继承自 ButtonBase,它为左键按下事件 (OnMouseLeftButtonDown) 添加了一个类处理程序。正如UIElement.MouseLeftButtonDown事件的文档所提到的(强调我的):

某些控件类可能具有对鼠标按钮事件的固有类处理。鼠标左键按下事件是最有可能在控件中进行类处理的事件。类处理通常将底层 Mouse 类事件标记为已处理。一旦事件被标记为已处理,附加到该元素的其他实例处理程序通常不会被引发。任何其他依附于元素的类或实例处理程序,其冒泡方向朝向 UI 树中的根,通常也不会被引发。

您可以使用 ClickMode 并将其设置为 ClickMode.Hover,这似乎可以防止您看到的行为。但是,您可能必须在事件处理程序中为此特定实例维护自定义逻辑,以设置复选框的正确切换状态。

您也可以尝试 PreviewMouseLeftButtonDown 事件。但是,将该事件标记为在您的处理程序中已处理可能会对其余的 MouseDown 事件产生副作用 - 它们将携带已处理的信息,这将阻止其他实例处理程序,除非它们添加了带有用于处理已处理事件的标志的 AddHandler。

于 2009-08-25T22:00:09.783 回答
0

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

于 2009-08-25T22:55:02.400 回答