Wpf OpenTK使触摸按钮提升单击事件与鼠标不同
我正在尝试做什么:我目前正在WPF应用程序中托管一个OpenTK glControl(通过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,从而开始设置动画。当只使用鼠标时,一切都能完美工作 问题:我的应用程序
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
,因为更高的优先级会再次导致触摸延迟