Skip to main content
 首页 » 编程设计

c#之如何拦截 UWP Webview 组件上的触摸事件

2024年02月27日34小虾米

我正在创建 UWP 分屏应用。我希望能够拖放网页 View 以更改其位置。

我无法设法订阅在 webview 表面发生的触摸事件以开始处理拖动手势。我所有的触摸都被 webview 消耗/捕获。

我试过了

  • 在 WebView 上监听 PointerMoved 事件 - 不生成任何事件
  • 在 WebView 的父容器(网格)上监听 PointerMoved 事件 - 不会为 Webview 表面生成任何事件
  • 在 CoreWindow 上监听 PointerMoved (CoreWindow.GetForCurrentThread()) - 不会为 webview 表面生成任何事件
  • 将 JavaScript 代码注入(inject) webview 以收集触摸事件 - 这可行,但我无法将事件传递回 C# 代码,因为 window.external.notify 需要将域列入白名单(不支持通配符) ), 我想让它可用于所有网页。

如何拦截 UWP webview 组件上发生的触摸事件?

请您参考如下方法:

一般情况下,我们无法拦截超过WebView的触摸事件组件,这是设计使然。引用Web view中的输入事件和Tab键顺序 :

As indicated in the Events table on the WebView class page, web view doesn’t support most of the user input events inherited from UIElement, such as KeyDown, KeyUp, and PointerPressed. Instead, you can use InvokeScriptAsync with the JavaScript eval function to use the HTML event handlers, and to use window.external.notify from the HTML event handler to notify the application using WebView.ScriptNotify.

通常,这里的解决方法是使用一些 JavaScript 库来识别/收集用户输入并使用 InvokeScriptAsync 与 JavaScript 交互。方法和 ScriptNotify事件。但是,如您所知,要使外部网页在调用 window.external.notify 时触发 ScriptNotify 事件,您必须在 <应用程序 list 的 strong> ApplicationContentUriRules 部分。域通配符(例如,“ https://.com”和“https://.”)是不允许的。所以这不是您的选择。

对于您的情况,我建议您为您的 WebView 添加标题或其他一些边框,然后拖动标题/边框以更改其位置,就像在 Edge 或 Chrome 中一样。在这些浏览器中,拖放内容表面也不会改变浏览器的位置。要更改其位置,我们需要拖动其标题。