如何将触摸事件路由到单独的控件 UWP C#
How to route touch events to separate controls UWP C#
我遇到了自定义触摸事件处理的主要问题。
目标是根据使用的手指数量将触摸事件路由到不同的控件。
例如:
我们有一个 scrollview,里面排列着很多 webview。
缩放因子设置为全屏显示一个网络视图。
目前我正在使用这样的指针按下/释放功能来配置控件,因此事件将被正确的捕获:
int pointerCount = 0;
private void ScrollView_PointerPressed(object sender, PointerRoutedEventArgs e)
{
try
{
pointerCount++;
if (pointerCount > 3)
pointerCount = 0;
switch (pointerCount)
{
case 1:
// I don't do anything, so it goes to the webview anyway
break;
case 2:
EnableScrolling();
break;
case 3:
ZoomInOut();
break;
default:
return;
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
private void EnableScrolling()
{
ScrollViewer.ZoomMode = ZoomMode.Enabled;
ScrollViewer.VerticalScrollMode = ScrollMode.Enabled;
ScrollViewer.HorizontalScrollMode = ScrollMode.Enabled;
}
- 单指事件应该转到 webview // 这有效
- 2 指事件应该转到 ScrollView // 这是行不通的,因为 webview 抓住了触摸事件并且不会再次释放它
- 三指事件应该缩小 // 这有效
始终调用PointerPressed,但当PointerPressed 在webview 上时不调用PointerReleased。
这也导致了不减少pointerCount的效果,所以有可能做一个单指点击3次并导致三指事件和缩小,这是不应该发生的。
希望您能看到问题并帮助解决。
如果您认为这是一种错误的方法,请随时展示一个更好的替代方案。
好吧,我找不到合适的解决方案,但如果它们被释放,我可以通过增加指针事件的计数来消除不需要的副作用。
private void ScrollViewer_PointerReleased(object sender, PointerRoutedEventArgs e)
{
pointerCount = 0;
}
所以正确的方向处理现在工作正常,但我仍然不能做类似的事情:
currentWebView.CapturePointer(e.Pointer);
因为它不会将 pointerEvent 植根到它的内容中,所以它会调用 WebView 的指针事件,但不会将它植根到它的 html 和 js 内容中。
我也试过用
.... wb.ManipulationStarted += Wb_ManipulationStarted; ....
private void Wb_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
{
// something here
}
但是这个也不会到内容里。
对另一种方法有什么想法吗?
我知道怎么处理了,简单到哭了...
我只是添加了这行代码来告诉webviews js有一个事件...
await webView.InvokeScriptAsync("eval", new string[] { "document.elementFromPoint(" + pointX + ", " + pointY + ").click();" });
Web 视图处理其余部分。所以没有我担心的自定义调用,它只是调用的标准函数,它总是在执行 touch/click 时调用。
我遇到了自定义触摸事件处理的主要问题。 目标是根据使用的手指数量将触摸事件路由到不同的控件。
例如: 我们有一个 scrollview,里面排列着很多 webview。 缩放因子设置为全屏显示一个网络视图。
目前我正在使用这样的指针按下/释放功能来配置控件,因此事件将被正确的捕获:
int pointerCount = 0;
private void ScrollView_PointerPressed(object sender, PointerRoutedEventArgs e)
{
try
{
pointerCount++;
if (pointerCount > 3)
pointerCount = 0;
switch (pointerCount)
{
case 1:
// I don't do anything, so it goes to the webview anyway
break;
case 2:
EnableScrolling();
break;
case 3:
ZoomInOut();
break;
default:
return;
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
private void EnableScrolling()
{
ScrollViewer.ZoomMode = ZoomMode.Enabled;
ScrollViewer.VerticalScrollMode = ScrollMode.Enabled;
ScrollViewer.HorizontalScrollMode = ScrollMode.Enabled;
}
- 单指事件应该转到 webview // 这有效
- 2 指事件应该转到 ScrollView // 这是行不通的,因为 webview 抓住了触摸事件并且不会再次释放它
- 三指事件应该缩小 // 这有效
始终调用PointerPressed,但当PointerPressed 在webview 上时不调用PointerReleased。
这也导致了不减少pointerCount的效果,所以有可能做一个单指点击3次并导致三指事件和缩小,这是不应该发生的。
希望您能看到问题并帮助解决。 如果您认为这是一种错误的方法,请随时展示一个更好的替代方案。
好吧,我找不到合适的解决方案,但如果它们被释放,我可以通过增加指针事件的计数来消除不需要的副作用。
private void ScrollViewer_PointerReleased(object sender, PointerRoutedEventArgs e)
{
pointerCount = 0;
}
所以正确的方向处理现在工作正常,但我仍然不能做类似的事情:
currentWebView.CapturePointer(e.Pointer);
因为它不会将 pointerEvent 植根到它的内容中,所以它会调用 WebView 的指针事件,但不会将它植根到它的 html 和 js 内容中。
我也试过用
.... wb.ManipulationStarted += Wb_ManipulationStarted; ....
private void Wb_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
{
// something here
}
但是这个也不会到内容里。
对另一种方法有什么想法吗?
我知道怎么处理了,简单到哭了...
我只是添加了这行代码来告诉webviews js有一个事件...
await webView.InvokeScriptAsync("eval", new string[] { "document.elementFromPoint(" + pointX + ", " + pointY + ").click();" });
Web 视图处理其余部分。所以没有我担心的自定义调用,它只是调用的标准函数,它总是在执行 touch/click 时调用。