【发布时间】: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