WebView2控件无法加载HTML字符串。

9

WebView2 控件:如下所示,HTML字符串可以通过在 Button_Click(...) 事件中调用 NavigateToString(...) 成功加载。但是我需要在 Window 或其 Grid 加载后立即加载 HTML 字符串。然而,无论是将以下代码放在构造函数MainWindow(){...} 中还是放在 rootGrid_Loaded(...) 事件中,都会抛出下面所示的错误:

问题: 我们应该如何解决这个问题,使得 HTML 字符串可以在 Window 或者 Grid 加载后立即加载?或者是否有更好的解决方案或变通方法?

MainWindow.xaml:

<Window x:Class="WpfWebView2TEST.MainWindow"
        .....
        xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
        mc:Ignorable="d"
        Style="{StaticResource CustomWindowStyle}"
        Title="MainWindow" Height="450" Width="800">
    
    <Grid>
        <Button x:Name="btnTest" Content=Test" Click="btnTest_Click"/>
        <wv2:WebView2 Name="MyWebView" />
    </Grid>
</Window>

注意:在以下构造函数或 rootGrid_Loaded(...) 事件中调用 MyLoadHTMLString() 方法会抛出以下错误:

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        MyLoadHTMLString();
    }
........
}

private void rootGrid_Loaded(object sender, RoutedEventArgs e)
{
  MyLoadHTMLString();
}


public void MyLoadHTMLString()
{
    string sHTML = "<!DOCTYPE html>" +
    "<html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">" +
    "<head>" +
        "<meta charset=\"utf-8\" />" +
        "<title>Test Title</title>" +
    "</head>" +
    "<body>" +
        "<p>Test paragraph</p>" +
    "</body>" +
    "</html>";
MyWebView.NavigateToString(sHTML);
}

注意:在按钮点击事件后,成功地将HTML字符串加载到WebView2中。

private void btnTest_Click(object sender, RoutedEventArgs e)
{
  MyLoadHTMLString();
}

错误:

System.InvalidOperationException HResult=0x80131509 Message=尝试使用WebView2功能,需要在CoreWebView2初始化之前使用它的CoreWebView2。请先调用EnsureCoreWebView2Async或设置Source属性。 Source=Microsoft.Web.WebView2.Wpf

更新:

这篇MSDN文档的第二和第三段似乎提供了解决此类问题的一些方法,但我不确定如何实施。

2个回答

13

要加载 HTML 到 WebView2 中,可以使用 NavigateToString

private async void Form1_Load(object sender, EventArgs e)
{
    var html = @"
        <html>
            <head>
                <title>Basic Web Page</title>
            </head>
            <body>
                Hello World!
            </body>
        </html>";

    await webView21.EnsureCoreWebView2Async();
    webView21.NavigateToString(html);
}

enter image description here


10

首先:

回答你的问题:

在使用Webview2控件前,你必须确保它已经被初始化。你可以通过以下两种方式之一来实现:要么调用:

await MyWebView.EnsureCoreWebView2Async();

或者简单地设置Source属性。

接下来: 这只是一个好建议。我从不使用“NavigateToString”,因为在C#字符串中有HTML标记很容易变得“混乱”。

相反,我创建了一个子文件夹(称为“html”)。然后我在该文件夹中有一个html文件、一个css文件和一个script文件。现在我可以直接编辑文件,并在设计时获得智能感知和错误检查。

记住: 点击“Property Inspector”中的文件,然后在属性窗口中选择“Copy to output directory”。这里选择:“Copy if newer”。现在,文件将被复制到“Bin”文件夹中,因此WebView2可以找到它们。

现在,在您的代码中,您只需将WebView2的Source属性设置为HTML文件的路径,像这样:

MyWebView.Source = new Uri(Path.Combine(Environment.CurrentDirectory, @"Html\MyWebView.html"));

注意:这将自动初始化WebView2并导航到您的html文件。
在您的html文件中,现在您可以像通常为网页做的那样包含css和script文件:
<html>
<head>
    <meta charset="utf-8" />
    <title>Whatever</title>
    <link rel="stylesheet" href="MyWebView.css" type="text/css" />
    <script type="text/javascript" src="MyWebView.js">
    </script>
................

在我看来,这是一种更好的使用本地HTML的方式 - 更容易维护。


传递给应用程序的HTML字符串是动态字符串,因此我无法控制它。这会有问题吗? - nam
没问题。在你的问题中,你展示了一个C#字符串(我认为这很难读和维护)。如果你从其他地方获取字符串,那么可能没问题(因为你不需要维护它,也不需要智能提示)。顺便问一下:你已经让它工作了吗? - Poul Bak
您的建议很有效(谢谢)。我可能会先将动态HTML存储到您建议的文件夹中,然后从那里在Webview2中显示。希望这不会影响性能。 - nam
我认为你不会看到任何性能差异,我一直在使用它。花费时间的是解析HTML,如果HTML很大,从本地文件加载会更快。 - Poul Bak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接