我正在开发WPF中的自定义用户控件,并尝试接收我控制范围内的所有触摸事件(因此我可以实现“取消触摸”,用户通过点击其他地方取消操作)。有什么好办法吗?显然,如果我使用TouchDown或其他事件,我只会收到控制内部触摸的通知。
我尝试从PreviewTouchDown
接收Application.Current.MainWindow
个事件,但除了它感觉有点脏之外它也不能很好地工作 - 只要我捕获这些事件,{{1}我的自定义控件内部停止工作(它不再识别触摸)。
有没有好办法解决这个问题?只接收所有触摸事件就足够了,然后我可以检查它们是否在我的控制之内。
答案 0 :(得分:1)
在WPF中,事件遍历元素树。以“预览”开头的事件是向上移动到底部的事件,意味着从父项到它包含的元素。在您的情况下,TouchDown事件将从其发起的控件传播,然后它将向父母冒泡。 PreviewTouchDown将以相反的方向行进:从父级到控件。 您在Application.Current.MainWindow中处理PreviewTouchDown事件的想法很好,如果这是您想要的,则应该处理所有PreviewTouchDown事件。但在您的情况下,如果您想检查事件是否来自您的自定义控件,您应该捕获MainWindow中的所有TouchDown事件并检查它们的Source属性,如下所示:
private void CommonClickHandler(object sender, RoutedEventArgs e)
{
FrameworkElement feSource = e.Source as FrameworkElement;
if(feSource.Name == "MyCustomControlName")
{
//cancel whatever you want to cancel
e.Handled=true;
}
}
不要捕获PreviewTouchDown事件,因为这个事件将首先在MainWindow中弹出,稍后将一直移动到您的控件。 This msdn链接应该为您提供更多信息:http://msdn.microsoft.com/en-us/library/ms742806.aspx