2

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

问题:我们如何才能解决问题并在HTML string加载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>

注意:在以下构造函数中调用 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);
}

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

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

错误

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

更新

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

4

2 回答 2

6

第一的:

你的问题的答案:

您必须确保Webview2控件initialized在您可以使用它之前。您可以通过以下两种方式之一执行此操作,或者调用:

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 和脚本文件:

<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 的一种更好的方式 - 更易于维护。

于 2020-07-20T00:21:06.383 回答
3

要将 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);
}

在此处输入图像描述

于 2021-01-23T21:00:51.407 回答