Wpf WebView2将永远不会返回
在我的WPF应用程序中,我需要显示一个html字符串,并且我知道我需要在调用NavigateToString之前调用EnsureCreWebView2Async方法,因为否则CoreWebView将为null,我将有一个异常。问题在于,等待RewreWebView2Async的过程永远不会结束 我创建了一个小应用程序来重现问题(不包括与我的大项目相关的问题),问题也是一样的Wpf WebView2将永远不会返回,wpf,webview2,Wpf,Webview2,在我的WPF应用程序中,我需要显示一个html字符串,并且我知道我需要在调用NavigateToString之前调用EnsureCreWebView2Async方法,因为否则CoreWebView将为null,我将有一个异常。问题在于,等待RewreWebView2Async的过程永远不会结束 我创建了一个小应用程序来重现问题(不包括与我的大项目相关的问题),问题也是一样的 如果我设置WebView2的源属性传递Url,那么它就可以工作了 如果调用NavigateToString而不调用Ens
- 如果我设置WebView2的源属性传递Url,那么它就可以工作了李>
- 如果调用NavigateToString而不调用EnsureCrewebView2Async,则会出现异常(如预期的那样)
- 如果在调用NavigateToString之前或在设置源属性之前调用EnsureCrewebView2Async(这应该不是问题,因为根据文档,多次调用它不会产生任何效果),那么它将永远挂起。 调用不会引发任何异常,控制台中也不会出现任何消息。非常令人沮丧
我还尝试更改目标平台,但没有更改。您应该推迟初始化webview,直到调用OnContentTrendered。我改变了你的密码,它很有魅力。请参见下面的更改
public partial class WebWindow : Window
{
private string _url;
private string _html;
public WebWindow()
{
InitializeComponent();
}
protected override async void OnContentRendered(EventArgs e)
{
base.OnContentRendered(e);
try
{
var webView2Environment = await CoreWebView2Environment.CreateAsync();
await WpfBrowser.EnsureCoreWebView2Async(webView2Environment);
if(!string.IsNullOrEmpty(_url))
WpfBrowser.Source = new Uri(_url);
else if(!string.IsNullOrEmpty(_html))
WpfBrowser.NavigateToString(_html);
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
}
}
public void ShowFromUrl(string url)
{
_url = url;
Show();
}
public void ShowFromHtml(string html)
{
_html = html;
Show();
}
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有异步void OpenUrl\u单击(对象发送方,路由目标)
{
var browserWindow=new WebWindow();
browserWindow.ShowFromUrl(“http://www.microsoft.com");
}
私有异步void OpenHtml\u单击(对象发送方,路由目标)
{
var browserWindow=new WebWindow();
browserWindow.ShowFromHtml(@“测试标题testsdfsdfsdsfklsdkflkdlf
dsfdsfds”);
}
}
您还可以从我的git repo中查看类似的代码。
它是否挂起
以确保重新编写EBVIEW2ASync
或引发异常?您正在使用最新的WebView2
控件吗?是的,它挂起在EnsureCreWebview2Aync上,并且从不进入捕获异常。我使用的是nuget建议的最后一个预发布版本(version=“1.0.824-prerelease”),谢谢,它在“真正的项目”中也能工作!我不知道你怎么知道我在哪儿都没找到的东西,但我很高兴你知道:-)
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void OpenUrl_Click(object sender, RoutedEventArgs e)
{
var browserWindow = new WebWindow();
//await browserWindow.Initialize(); // this also never completes
browserWindow.OpenUrl("http://www.microsoft.com");
browserWindow.Show();
}
private async void OpenHtml_Click(object sender, RoutedEventArgs e)
{
var browserWindow = new WebWindow();
await browserWindow.Initialize();
browserWindow.LoadHtml(@"<html><head><title>Test title</title></head><body><p>Test</p></body></html>");
browserWindow.Show();
}
}
<Window x:Class="WebViewApp.WebWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WebViewApp" xmlns:wpf="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
mc:Ignorable="d"
Title="WebWindow" Height="450" Width="800">
<Grid>
<wpf:WebView2 Name="WpfBrowser" />
</Grid></Window>
public partial class WebWindow : Window
{
public WebWindow()
{
InitializeComponent();
}
public async Task Initialize()
{
try
{
await WpfBrowser.EnsureCoreWebView2Async(); // never completes
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
}
}
public void LoadHtml(string html)
{
WpfBrowser.NavigateToString(html);
}
public void OpenUrl(string url)
{
WpfBrowser.Source = new Uri(url);
}
}
public partial class WebWindow : Window
{
private string _url;
private string _html;
public WebWindow()
{
InitializeComponent();
}
protected override async void OnContentRendered(EventArgs e)
{
base.OnContentRendered(e);
try
{
var webView2Environment = await CoreWebView2Environment.CreateAsync();
await WpfBrowser.EnsureCoreWebView2Async(webView2Environment);
if(!string.IsNullOrEmpty(_url))
WpfBrowser.Source = new Uri(_url);
else if(!string.IsNullOrEmpty(_html))
WpfBrowser.NavigateToString(_html);
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
}
}
public void ShowFromUrl(string url)
{
_url = url;
Show();
}
public void ShowFromHtml(string html)
{
_html = html;
Show();
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void OpenUrl_Click(object sender, RoutedEventArgs e)
{
var browserWindow = new WebWindow();
browserWindow.ShowFromUrl("http://www.microsoft.com");
}
private async void OpenHtml_Click(object sender, RoutedEventArgs e)
{
var browserWindow = new WebWindow();
browserWindow.ShowFromHtml(@"<html><head><title>Test title</title></head><body><p>Testsdfsdfsdfsdfdsfdsfklsdkflkdlf<br>dsfdsfdsfdsfsdfdsfds</p></body></html>");
}
}