【问题标题】:OpenTK makes touching button raise click event differently than mouseOpenTK 使触摸按钮引发的点击事件与鼠标不同
【发布时间】:2014-10-30 14:22:45
【问题描述】:

我想要做什么:我目前在我的 WPF 应用程序中托管一个 OpenTK glControl(通过 WindowsFormsHost)。该应用程序有很多按钮,但我们将重点关注暂停和播放按钮。我使用 VBO,这就是我为GL.DrawArrays(PrimitiveType.LineStrip, 0, frameCount ); 制作动画的方式。它正在绘制从 0 到 framecount 的顶点范围,所以当我点击播放时,它只是开始递增 framecount,从而开始动画。只需使用鼠标,一切都会完美运行。

问题:我的应用程序还需要使用触摸屏(FWIW,当我说触摸时,WPF 将其视为手写笔,而不是触摸)。当应用程序没有动画时,触摸工作正常,我不处理触摸事件,所以触摸按钮只会引发Click 事件。如果我们不制作动画,我没有任何问题。因此,当我使用鼠标Click 播放按钮时,UI 仍会响应我的鼠标(点击工作、悬停改变颜色等),但随后触摸似乎在一段时间内被忽略了。我必须触摸一个按钮 3 到 5 次才能完成它应该做的事情(比如暂停)。让我们回去,现在我们没有动画,这一次,如果我触摸播放按钮来引发Click 事件,它将开始动画,但我的触摸现在有同样的问题,必须多次触摸才能引发@ 987654329@ 事件,最重要的是,UI 现在不响应鼠标(WindowsFormsHost 仍然正确响应鼠标事件)。单击按钮或将鼠标悬停在按钮上不会执行任何操作。直到我可以让动画再次暂停,UI 才开始再次响应鼠标。

我尝试过什么以及我知道什么(我认为):当 UI 停止响应鼠标输入并且触摸输入混乱时,如果我使用 MOUSE 或 TOUCH 点击我之外的任何地方应用程序,它按预期工作。这让我相信这不是触摸屏驱动程序问题或任何东西。我还使用 Snoop 来查看正在引发(或不引发)哪些事件,以查看触控笔和鼠标被捕获和释放以及什么具有焦点。我找不到一个没有被释放的实例。如果有人愿意,我可以发布 Snoop 结果,显示鼠标和触摸点击之间的差异。我尝试在 MainWindow 上放一个预览鼠标,但是在 TOUCHING 播放之后,没有鼠标点击会引发此事件,并且在随机触摸播放按钮后的第一次触摸会触发此事件。我还尝试隐藏 WindowsFormsHost,并且鼠标和触摸点击都可以正常工作,就像它们应该减去 glControl 一样。因为我隐藏了 WindowsFormsHost,所以绘制事件永远不会被触发,这让我相信绘制函数可能存在问题。我知道这个错误WPF Touch Bug,但是我真的不认为这是我的问题。有些东西告诉我互操作是什么给我带来了问题,但我不确定。

我的代码:

    private void playFwdFunc()
    {
        //disable undrawing and enable drawing
        undraw = false;
        draw = true;

        //unpause animation
        paused = false;
        //enable/disable appropriate buttons
        pauseBtn.IsEnabled = true;
        stepBackBtn.IsEnabled = false;
        stepFwdBtn.IsEnabled = false;
        clearStart.IsEnabled = true;
        clearCurrent.IsEnabled = true;
        //refresh control
        glControl1.Invalidate();
    }


    private void playFwdClick(object sender, RoutedEventArgs e)
    {
        playFwdFunc();

    }

在我的 glPaint 事件中:

  if (frameCount < vertices.Length && !paused)
            {
                //draw more vertices
                if (draw)
                {
                    if (0 < (int)(vertices.Length / (25000 / speedTrack.Value)))
                        frameCount += (int)(vertices.Length / (25000 / speedTrack.Value));
                    else
                        frameCount++;
                }


                //draw less vertices
                else if (undraw)
                {
                    if (0 < (int)(vertices.Length / (25000 / speedTrack.Value)))
                        frameCount -= (int)(vertices.Length / (25000 / speedTrack.Value));
                    else
                        frameCount--;
                }


                //make sure we dont have a negative framecount (null pointer)
                if (frameCount < 0)
                {
                    paused = true;
                    frameCount = 0;
                 //   manageCodeBox();

                }
                //make sure we dont exceed # of vertices (null pointer)
                else if (frameCount > vertices.Length)
                {
                    frameCount = vertices.Length;
                    paused = true;
                 //   manageCodeBox();
                }

            }

我的问题:为什么用鼠标单击按钮会使 UI 的反应与触摸按钮不同,即使它们引发了相同的事件?任何意见表示赞赏。

【问题讨论】:

    标签: wpf opengl event-handling interop touchscreen


    【解决方案1】:

    所以我找到了导致该行为的原因,在我的绘制函数中,我不断引发一个具有glControl1.Invalidate() 的事件。

    我的最佳猜测:我唯一真正的猜测是,某些事件(例如在触控笔线程上发生的触摸)在调用 glControl1.Invalidate() 时会与 UI 线程发生实时锁定。我认为这就是为什么一些触摸被接受,但 UI 线程从未到达鼠标事件侦听器的原因。正如我所说:最好的猜测。

    我的解决方法:我最初创建了一个DispatcherTimer 来调用glControl1.Invalidate()。鼠标事件工作得很好,但是因为触摸被提升为鼠标点击,所以除非我处理触摸事件(我不想为我的 UI 上的每个按钮都这样做),否则会有延迟。到目前为止,我的下一个解决方案似乎正在奏效。

    在我的 Windows 构造函数中:CompositionTarget.Rendering += invalidateProcessor;

    功能:

    private void invalidateProcessor(object sender, EventArgs e)
        {
            Dispatcher.BeginInvoke(new Action(() => { if (!paused) glControl1.Invalidate(); }), DispatcherPriority.Background);
        }
    

    我选择了DispatcherPriority.Background,因为更高的优先级会再次导致触摸延迟。

    【讨论】:

      猜你喜欢
      • 2013-04-15
      • 2012-02-08
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多