WebView2 控件未加载 HTML 字符串

nam*_*nam 9 c# wpf xaml webview2

WebView2控件:如下所示,HTML 字符串通过事件内的NavigateToString(...)Button_Click(...)调用成功加载。但我需要在加载Window和/或其Grid加载后立即加载 HTML 字符串。MainWindow(){...}但是构造函数内或事件内的以下代码rootGrid_Loadded(...)会引发如下错误:

问题:我们怎样才能解决问题并在加载或HTML string后立即加载?或者有更好的解决方案/解决方法吗?WindowGrid

主窗口.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>
Run Code Online (Sandbox Code Playgroud)

注意:在以下构造函数中调用 MyLoadHTMLString() 或rootGrid_Loaded(...)事件会引发如下错误:

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);
}
Run Code Online (Sandbox Code Playgroud)

注意:以下按钮单击事件successfully将 HTML 字符串加载到WebView2

private void btnTest_Click(object sender, RoutedEventArgs e)
{
  MyLoadHTMLString();
}
Run Code Online (Sandbox Code Playgroud)

错误

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

更新

该MSDN 文档的第二段和第三段似乎为此类问题提供了一些解决方案。但我不知道如何实现它

Rez*_*aei 14

要将 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);
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Pou*_*Bak 12

第一的:

你的问题的答案:

您必须先确保该Webview2控件处于可用状态initialized,然后才能使用它。您可以通过以下两种方式之一执行此操作,即调用:

await MyWebView.EnsureCoreWebView2Async();
Run Code Online (Sandbox Code Playgroud)

或者简单地设置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"));
Run Code Online (Sandbox Code Playgroud)

注意:这将自动初始化 WebView2 并导航到您的 html 文件。

现在,您可以在 html 文件中包含 css 和脚本文件,就像通常对网页所做的那样:

<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>
................
Run Code Online (Sandbox Code Playgroud)

恕我直言,这是使用本地 html 的更好方法 - 更容易维护。