1

我正在 WPF 中开发一个自定义用户控件,并尝试接收我的控件之外的所有触摸事件(因此我可以实现“取消触摸”,用户通过点击其他地方来取消操作)。有什么好的方法可以做到这一点吗?显然,如果我使用 TouchDown 或其他事件,我只会在我的控件内收到触摸通知。

我尝试PreviewTouchDown从 接收事件Application.Current.MainWindow,但除了感觉有点脏之外,它也不能很好地工作 - 一旦我捕获这些事件,SurfaceListBox我的自定义控件内部就会停止工作(它不再识别触摸)。

有没有解决这个问题的好方法?简单地接收所有触摸事件就足够了,然后我可以检查它们是否在我的控制范围内。

4

1 回答 1

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 中弹出,稍后将一直到达您的控件。 msdn 链接应该为您提供更多信息:http: //msdn.microsoft.com/en-us/library/ms742806.aspx

于 2012-08-20T16:39:07.320 回答