C# 接收自定义控件之外的触摸事件

C# 接收自定义控件之外的触摸事件,c#,wpf,events,touch,C#,Wpf,Events,Touch,我正在WPF中开发一个自定义用户控件,并尝试接收我控制范围之外的所有触摸事件(因此我可以实现“取消触摸”,即用户通过点击其他地方来取消操作)。有什么好办法吗?显然,如果我使用触地或其他事件,我只会收到我控制范围内触地的通知 我尝试从Application.Current.MainWindow接收PreviewTouchDown事件,但除了感觉有点脏之外,它也不能很好地工作-一旦我捕获这些事件,自定义控件中的SurfaceListBox就会停止工作(它不再识别触摸) 有没有解决这个问题的好办法?简

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

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


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

在WPF中,事件在元素树中传播。以“预览”开头的事件是向上到底部移动的事件,即从父级到它包含的元素。在您的情况下,触地事件将从其起源的控件开始移动,然后它将向父母方向冒出气泡。PreviewTouchDown将以相反的方向移动:从父控件到控件。 您在Application.Current.main窗口中处理PreviewTouchDown事件的想法很好,如果这是您想要的,应该处理所有PreviewTouchDown事件。但在您的情况下,如果要检查事件是否起源于自定义控件,则应捕获主窗口中的所有触地事件并检查其源属性,如下所示:

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事件,因为此事件将首先在主窗口中弹出,稍后将一直进入您的控制。
msdn链接应该为您提供更多信息:

在WPF中,事件在元素树中传播。以“预览”开头的事件是向上到底部移动的事件,即从父级到它包含的元素。在您的情况下,触地事件将从其起源的控件开始移动,然后它将向父母方向冒出气泡。PreviewTouchDown将以相反的方向移动:从父控件到控件。 您在Application.Current.main窗口中处理PreviewTouchDown事件的想法很好,如果这是您想要的,应该处理所有PreviewTouchDown事件。但在您的情况下,如果要检查事件是否起源于自定义控件,则应捕获主窗口中的所有触地事件并检查其源属性,如下所示:

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事件,因为此事件将首先在主窗口中弹出,稍后将一直进入您的控制。 msdn链接应为您提供更多信息: