1

在代码隐藏的 ctor 中,我们从microsoft-ui-xaml-specs复制了以下代码

MyWebView.WebMessageReceived += (WebView2 sender, WebView2WebMessageReceivedEventArgs args) =>
{
    // Important to validate that the Uri is what we expect from that webview.
    string uriAsString = sender.Source.ToString();

    if (args.Source == uriAsString)
    {
        HandleWebMessageAsString(args.WebMessageAsString);
        HandleWebMessageAsJson(args.WebMessageAsJson);
    }

    else
    {
        // If the source is not validated, don't process the message.
        return;
    }
};

编辑 1:在 WebView 导航到页面之前注册事件处理程序。POST 不是我们页面的一部分。POST 来自一个由外部服务注入我们页面的 javascript 实例化的按钮。

xml

<WebView2 
    Name="MyWebView"  Grid.Row="1" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
    />

WebView2 正确导航和发布。我们在 WebView 中拥有该页面,并且我们知道该页面会收到响应。但是MyWebView.WebMessageReceived没有被击中。

根据WinUI 3.0 Feature Roadmap WebView2 应该在 WinUI 3 Preview 3 中实现。

我应该能够阅读回复吗?如果是这样,我哪里出错了?

4

1 回答 1

2

如果您已注册 WebMessageReceived 事件但没有看到您的事件处理程序运行,您可以检查以下内容:

  1. 确保在您加载的网页执行之前注册 WebMessageReceived 事件chrome.webview.postMessage。如果您在页面发布消息后注册事件处理程序,则事件处理程序不会触发。同样,您必须注意比赛。例如,如果您导航到在页面加载时执行 postMessage 的页面,然后注册 WebMessageReceived 事件,则无法保证哪个会先完成,您可能会或可能不会收到消息。
  2. 确保页面中的代码实际运行chrome.webview.postMessage并成功。您可以使用 WebView2 中的 DevTools 在页面中的该行代码上放置一个断点,并验证它是否执行并且在运行该代码之前您没有引发异常。
于 2020-11-20T21:50:55.290 回答