如何在WPF中初始化WebView2?

b1uwtaje  于 2022-11-18  发布在  其他
关注(0)|答案(3)|浏览(450)

我尝试在WPF应用程序中使用WebView2。我在docsother posts中读到,我应该调用EnsureCoreWebView2Async()或设置Source属性以初始化WebView。如果我设置Source,它将正确加载网页,但我不能这样做。因为我在内存中有html内容(并且不允许写入磁盘)。
所以我试着调用初始化方法:

var webView = new WebView2();

webView.NavigationCompleted += Navigation_Completed;
webView.Initialized += new EventHandler((object sender, EventArgs e) => { 
    webView.NavigateToString(myHtml);
});

await webView.EnsureCoreWebView2Async(null);

这段代码的运行被EnsureCoreWebView2Async()方法阻止了。我甚至可以等一分钟,但是什么也没发生,它只是卡在初始化中。没有异常,没有错误消息。我在UI线程上运行这段代码,但是当我在另一个线程上调用这个方法时,同样的事情发生了。
有人经历过这种行为吗?有什么想法吗?

myzjeezk

myzjeezk1#

若要手动显示WebView2,必须将其添加到窗体的Controls集合中。
当您将WebView2放到表单上时,设计工具会自动执行此动作。
干脆叫:

Controls.Add(webView)
await webView.EnsureCoreWebView2Async(null);

现在应该可以显示html了。

更新

如果愿意,您仍然可以将WebView2放到窗体上,只是不要设置Source属性。
然后您可以使用设计器来分配事件处理程序,并在Initialized事件中调用:

webView.NavigateToString(myHtml);

就像你现在一样。

nnsrf1az

nnsrf1az2#

如果需要转到特定的URI,我必须执行以下调用。
如前所述,请勿在XAML中设定Source属性。
请注意,wvWevView2Name。重要的是,您仍然需要等待CoreWebView2加载。现在,您可以将任何URI字符串替换为“https://www.microsoft.com“。

private async void wv_Initialized(object sender, EventArgs e)
    {
       await wv.EnsureCoreWebView2Async(null);
       wv.CoreWebView2.Navigate("https://www.microsoft.com");
    }
k5ifujac

k5ifujac3#

初始化webview2的适当位置是WPF OnContentRendered()示例:

protected override async void OnContentRendered(EventArgs e)
   {
        base.OnContentRendered(e);

        var webView2Environment = await CoreWebView2Environment.CreateAsync();
        await webView2.EnsureCoreWebView2Async(webView2Environment);

   }

相关问题