Wpf OpenTK使触摸按钮提升单击事件与鼠标不同

Wpf OpenTK使触摸按钮提升单击事件与鼠标不同,wpf,opengl,event-handling,interop,touchscreen,Wpf,Opengl,Event Handling,Interop,Touchscreen,我正在尝试做什么:我目前正在WPF应用程序中托管一个OpenTK glControl(通过WindowsFormsHost)。该应用程序有许多按钮,但我们将重点关注暂停和播放按钮。我使用VBO,这就是我如何设置GL.drawArray(PrimitiveType.LineStrip,0,frameCount)动画的方法。它正在绘制从0到framecount的顶点范围,因此当我点击play时,它只是开始增加framecount,从而开始设置动画。当只使用鼠标时,一切都能完美工作 问题:我的应用程序

我正在尝试做什么:我目前正在WPF应用程序中托管一个OpenTK glControl(通过
WindowsFormsHost
)。该应用程序有许多按钮,但我们将重点关注暂停和播放按钮。我使用VBO,这就是我如何设置
GL.drawArray(PrimitiveType.LineStrip,0,frameCount)动画的方法。它正在绘制从0到
framecount
的顶点范围,因此当我点击play时,它只是开始增加
framecount
,从而开始设置动画。当只使用鼠标时,一切都能完美工作

问题:我的应用程序也需要使用触摸屏(FWIW,当我说touch时,WPF将其视为触控笔,而不是触摸)。当应用程序未设置动画时,触摸正常工作,我不处理触摸事件,所以触摸按钮只会引发
单击
事件。如果我们不制作动画,我不会有任何问题。因此,当我使用鼠标
单击播放按钮时,UI仍然会响应我的鼠标(单击工作,悬停会改变颜色,等等),但在一段时间内,触摸似乎会被忽略。我必须触摸一个按钮3到5次,然后它才能做它应该做的事情(比如暂停)。让我们回到过去,现在我们没有设置动画,这一次,如果我触摸播放按钮以引发
单击
事件,它将开始设置动画,但我的触摸现在有相同的问题,即必须多次触摸才能引发
单击
事件,除此之外,UI现在不会响应鼠标(WindowsFormsHost仍能正确响应鼠标事件)。单击按钮或将鼠标悬停在按钮上没有任何作用。直到我能让动画再次暂停,UI才开始再次响应鼠标事件

我尝试过什么和(我认为)什么我知道:当用户界面停止响应鼠标输入且触摸输入混乱时,如果我使用鼠标或触摸键单击应用程序之外的任何位置,它都会按预期工作。这让我相信这不是触摸屏驱动程序问题或任何问题。我还使用Snoop查看引发了什么(或没有)事件要查看正在捕获和释放的手写笔和鼠标以及有焦点的内容。我找不到一个没有释放的实例。如果有人愿意,我可以发布显示鼠标和触摸单击之间差异的Snoop结果。我尝试将预览鼠标放在主窗口上,但在触摸“播放”后,没有鼠标单击会引发此问题事件,并且在触摸播放按钮后的第一次触摸将触发此事件。我还尝试隐藏WindowsFormsHost,鼠标和触摸单击都会正常工作,减去glControl。因为我隐藏WindowsFormsHost,绘制事件永远不会触发,这使我相信绘制功能可能有问题我知道这个错误,但我并不认为这是我的问题。有些东西告诉我互操作是什么给了我问题,但我不确定

我的代码:

    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();

    }
在我的绘画活动中:

  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();
                }

            }
if(帧数顶点.长度)
{
frameCount=顶点。长度;
暂停=真;
//manageCodeBox();
}
}

我的问题:为什么用鼠标点击按钮会使UI做出与触摸按钮不同的反应,即使它们引发相同的事件?任何输入都是值得赞赏的。

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

我的最佳猜测:我唯一真正的猜测是,某些事件(如触控笔线程上发生的触摸)如何在调用
glControl1.Invalidate()时进入UI线程的活动锁
。我想这就是为什么一些触摸被接受,但UI线程从未到达鼠标事件侦听器。正如我所说:最佳猜测

我的解决方法:我最初制作了一个
Dispatchermer
来调用
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
,因为更高的优先级会再次导致触摸延迟