gpt4 book ai didi

c# - 双击事件在窗口级别和控件级别触发,即使它是在控件内处理的

转载 作者:太空狗 更新时间:2023-10-29 23:38:11 27 4
gpt4 key购买 nike

我正在开发一个 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;
}
}

我的 XAML 看起来像这样:

<Window x:class="MyProject.MyWindow"
MouseDoubleClick="window_DoubleClick">
<Grid Grid.Row="0" Margin="0">
<local:myCustomControl
MouseDoubleClick="myCustomControl_DoubleClick"/>
</Grid>
</Window>

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

private void myCustomControl_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) 
{
e.Handled = true;
}

虽然预览事件会在 Window 触发之前停止双击,但如果不重构大量代码我就无法使用它。我的自定义控件有几个子控件也处理其双击事件。如果在父控件级别调用预览事件,则双击事件永远不会通过子控件向下传递,因此双击不会执行我希望它执行的操作。如果可能,我想避免重构子控件中的任何代码。话虽这么说,我的问题是:一旦处理了控件的双击事件,是否有任何方法可以阻止触发窗口级双击事件?我一直在努力想办法解决这个问题。感谢您的帮助!

最佳答案

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

Although this routed event seems to follow a bubbling route through an element tree, it actually is a direct routed event that is raised along the element tree by each UIElement. If you set the Handled property to true in a MouseDoubleClick event handler, subsequent MouseDoubleClick events along the route will occur with Handled set to false.

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

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

注意:由于某些原因,这不适用于 MouseLeftButtonUp

关于c# - 双击事件在窗口级别和控件级别触发,即使它是在控件内处理的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30757072/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com