双击事件在窗口级别和控制级别触发,即使在控件内处理它也是如此

che*_*sea 5 c# wpf events

我正在开发一个WPF应用程序,我有一个窗口级双击事件,当用户双击窗口中的任何位置时,该事件最大化应用程序窗口.但是,我还在应用程序窗口中有一个自定义控件,并在自定义控件中有一个单独的双击事件.当用户双击自定义控件时,只应触发控件的双击事件,并且窗口不应调整大小.我的代码看起来像这样:

public class Window 
{
    private void window_DoubleClick(object sender, EventArgs e) 
    {
        /// Maximize/minimize window
    }

    private void myCustomControl_DoubleClick(object sender, EventArgs e) 
    {
        /// Do other things, but PLEASE don't resize!
        e.Handled = true;
    } 
}
Run Code Online (Sandbox Code Playgroud)

我的XAML看起来像这样:

<Window x:class="MyProject.MyWindow"
     MouseDoubleClick="window_DoubleClick">
    <Grid Grid.Row="0" Margin="0">
        <local:myCustomControl
            MouseDoubleClick="myCustomControl_DoubleClick"/>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

不幸的是,使用此代码,当用户双击控件时,控件事件将触发,但Window事件也会触发.我已尝试在控件事件中设置e.Handled = true,但无论如何都会触发Window事件.唯一阻止触发窗口级双击事件的是使用以下方法处理自定义控件的预览双击事件:

private void myCustomControl_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) 
{
    e.Handled = true;
}
Run Code Online (Sandbox Code Playgroud)

虽然预览事件在它可以触发之前停止Window双击,但是我不能使用它而不必重构好一些代码.我的自定义控件有一些子控件也可以处理它的双击事件.如果在父控件级别调用预览事件,则双击事件永远不会向下通过子控件,因此双击不会执行我想要的操作.如果可能的话,我想避免重构子控件中的任何代码.话虽如此,我的问题是:一旦控件的双击事件被处理,有没有办法阻止窗口级双击事件被触发?我一直在疯狂地试图解决这个问题...任何帮助表示赞赏!

Tim*_*ann 3

问题是,MouseDoubleClick 只是看起来冒泡,但实际上并没有。来自MSDN

尽管此路由事件似乎遵循元素树中的冒泡路由,但它实际上是由每个 UIElement 沿着元素树引发的直接路由事件。如果在 MouseDoubleClick 事件处理程序中将 Handled 属性设置为 true,则沿路线发生的后续 MouseDoubleClick 事件将在 Handled 设置为 false 的情况下发生。

相反,您可以使用 MouseLeftButtonDown 事件并检查点击计数:

private void myCustomControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (e.ClickCount == 2)
    {
        //do something
        e.Handled = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

MouseLeftButtonUp注意:由于某种原因,这不起作用。