我正在开发一个WPF应用程序,我有一个Window级别的双击事件,当用户双击窗口中的任何位置时,该事件可以最大化应用程序窗口。但是,我还在应用程序窗口中有一个自定义控件,并在自定义控件中有一个单独的双击事件。当用户双击自定义控件时,只应触发控件的双击事件,并且窗口不应调整大小。我的代码看起来像这样:
<p>
If you operate a service that connects to the internet and intend to collect any
<a href= "<%=Project.Core.Common.PublisherConfigurationManager.Navigation%>privacy/faq.aspx#16" target="_blank" class="dotlink">personal information</a>...
</p>
我的XAML看起来像这样:
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;
}
}
不幸的是,使用此代码,当用户双击控件时,控件事件将触发,但Window事件也会触发。我已尝试在控件事件中设置e.Handled = true,但无论如何都会触发Window事件。唯一阻止触发窗口级双击事件的是使用以下方法处理自定义控件的预览双击事件:
<Window x:class="MyProject.MyWindow"
MouseDoubleClick="window_DoubleClick">
<Grid Grid.Row="0" Margin="0">
<local:myCustomControl
MouseDoubleClick="myCustomControl_DoubleClick"/>
</Grid>
</Window>
虽然预览事件在它可以触发之前停止Window双击,但我不能使用它而不必重构好一些代码。我的自定义控件有一些子控件也可以处理它的双击事件。如果在父控件级别调用预览事件,则双击事件永远不会向下通过子控件,因此双击不会执行我想要的操作。如果可能的话,我想避免重构子控件中的任何代码。话虽如此,我的问题是:一旦控件的双击事件被处理,有没有办法阻止窗口级双击事件被触发?我一直在疯狂地试图解决这个问题...任何帮助表示赞赏!
答案 0 :(得分:2)
问题是,MouseDoubleClick只显示为冒泡,但实际上并非如此。来自MSDN:
虽然这个路由事件似乎遵循通过元素树的冒泡路径,但它实际上是每个UIElement沿元素树引发的直接路由事件。如果在MouseDoubleClick事件处理程序中将Handled属性设置为true,则沿着路径的后续MouseDoubleClick事件将在Handled设置为false的情况下发生。
相反,您可以使用MouseLeftButtonDown事件并检查clickcount:
private void myCustomControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 2)
{
//do something
e.Handled = true;
}
}
注意:由于某种原因,这不适用于MouseLeftButtonUp
。
答案 1 :(得分:0)
我会尝试在窗口级事件中添加自定义控件的检查。如果发件人与您的自定义控件匹配,请对发件人进行类型检查,然后退回。