【问题标题】:Receiving touch events outside of custom control在自定义控件之外接收触摸事件
【发布时间】:2012-08-20 16:25:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# wpf events touch


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多