快速连续检测敲击事件

时间:2011-05-12 10:42:20

标签: silverlight windows-phone-7

我有显示多个图像或按钮之一的页面。单击按钮时,我将其隐藏并显示列表中的下一个图像。点击图像使其消失并再次显示按钮。

快速连续多次单击按钮时,显示的图像不会响应被点击。我想这是由于UI线程阻塞,但我尝试使用工作线程,但仍无法正常工作。

public void ShowNextImage()
    {

image_new.Source = getCurrentBitmap();
 workerThread.WorkerReportsProgress = true;
        workerThread.WorkerSupportsCancellation = true;
        workerThread.DoWork += new DoWorkEventHandler(worker_DoWork);
        workerThread.RunWorkerCompleted += new      RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
 workerThread.RunWorkerAsync();
  }
  void worker_DoWork(object sender, DoWorkEventArgs e)
    {

        Deployment.Current.Dispatcher.BeginInvoke(() =>
        {

                transition.Begin();
                transition.Completed += delegate
                {
                    transition.Stop();
                };


        });


    }
    void worker_RunWorkerCompleted(object sender,
                           RunWorkerCompletedEventArgs e)
    {


        if (e.Error != null)
        {
            // Happens on the UI thread so its ok
            MessageBox.Show("Error occurred...");

        }
    }

3 个答案:

答案 0 :(得分:1)

我建议您从Codeplex安装Windows Phone Toolkit并使用GestureListener。这使您可以检测到许多不仅仅是TapDoubleTap的内容,它还会支持缩放大小和拖动。

确保在VS2010中打开源代码并查看GestureSample.xaml您可能只需将其中的大部分内容提升到您的应用中。

答案 1 :(得分:0)

我的猜测是你委托代码导致问题:

  transition.Completed += delegate
            {
                transition.Stop();
            };

我的猜测是,在您开始下一次图像转换时,所有线程上下文切换中的Completed事件都会被触发。

有一些事情你可以尝试帮助解决这个问题:

  • 绝对只订阅每次转换完成一次
  • 尝试为每个实际转换使用单独的转换实例
  • 尝试保护按钮,以便在转换过程中无法按下
  • 尝试让转换自行停止(它们不必重复?)
  • 尝试重新组织转换逻辑,使其不那么多线程(不确定应用程序中还有其他内容 - 我明白如果你还有很多其他事情发生,这可能不是完全可能的)
  • 尝试使用VisualStateManager状态更改而不是这些手动制作的过渡

不要一起尝试这些:)

当然,我的猜测可能是错的......它可能是别的......

答案 2 :(得分:0)

再次阅读此内容......另一种可能性是在按钮顶部绘制了一些内容,而这正在捕捉触摸事件。

一个基本建议是:

  • 摆脱workerthread代码 - 回到UI代码
  • 在Button_Click处理程序
  • 中放入一些简单的Debug.WriteLine代码

使用此按钮将告诉您Button是否仍在响应点击事件或是否发生了更复杂的事情。我的经验是,通常Button在点击级别继续工作现在与你击中它们的次数有关 - 所以其他东西在点击逻辑本身或者在按钮顶部显示的其他东西上出错了,这就防止了它被点击。