标签: webview2

即使在 CoreWebView2InitializationCompleted 事件发生后,EnsureCoreWebView2Async 也未准备好

根据 Microsoft 在 Windows 窗体中开始使用 webView2(截至 2021 年 3 月 9 日),我得到了以下代码(未设置 webView2.source;从 Form.Designer.cs 中编辑):

    public Form1() {
      InitializeComponent();
      InitializeAsync();
    }

    async void InitializeAsync() {
      Console.WriteLine("InitializeAsync starting");
      await webView2.EnsureCoreWebView2Async(null);
      Console.WriteLine("InitializeAsync done");
    }

    private void Form1_Load(object sender, EventArgs e) {
      Console.WriteLine("Load event");
    }

    private void webView2_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) {
      Console.WriteLine("CoreWebView2InitializationCompleted event");
      if ((webView2 == null) || (webView2.CoreWebView2 == null))
        Console.WriteLine("not ready");
      webView2.NavigateToString(File.ReadAllText("index.html"));
    }
Run Code Online (Sandbox Code Playgroud)

我很惊讶在 NavigateToString() 处遇到异常:

System.InvalidOperationException
  HResult=0x80131509
  Message=The instance of CoreWebView2 is uninitialized and unable to complete this operation. …
Run Code Online (Sandbox Code Playgroud)

c# winforms webview2

8
推荐指数
1
解决办法
2万
查看次数

相当于 WebView2 中的 WebBrowser.InvokeScript(String, Object[])

在我的 WPF 应用程序中,我能够使用 WebBrowser 的 InvokeScript(String, Object[]) 方法成功地将消息从 WPF 传递到 JavaScript。我在 Object[] 参数中传递消息,并且 JS 代码很好地接受了它。(见下面的代码)

如何在 WebView2 中实现同样的效果?有什么方法可以像在WebBrowser控件中一样将参数传递给JS代码吗?

窗口.xaml

<Grid>
    <DockPanel> 
        <StackPanel>        
        <TextBox x:Name="txtMessageFromWPF" Width="150" FontSize="20"></TextBox>
        <Button x:Name="btnCallDocument" Click="btnCallDocument_Click" Content="CallDocument" />
        </StackPanel>
        <WebBrowser x:Name="webBrowser" DockPanel.Dock="Top" Margin="30"/>           
    </DockPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)

窗口.xaml.cs

private void btnCallDocument_Click(object sender, RoutedEventArgs e)
{
    webBrowser.InvokeScript("WriteMessageFromWPF", new object[] { this.txtMessageFromWPF.Text });
}
Run Code Online (Sandbox Code Playgroud)

JS代码:

<script type="text/javascript">
    function getAlert()
    {
        alert("Hi the page is loaded!!!");
    }
    window.onload = getAlert;
    
    function WriteMessageFromWPF(message){
        document.write("Message from WPF: " + message);
    }
</script>
Run Code Online (Sandbox Code Playgroud)

.net webbrowser-control webview webview2

7
推荐指数
1
解决办法
8841
查看次数

如何在 WPF 中初始化 WebView2?

我正在尝试在 WPF 应用程序中使用 WebView2。我在文档其他帖子中读到,我应该调用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);
Run Code Online (Sandbox Code Playgroud)

此代码的运行被该EnsureCoreWebView2Async()方法阻止。我什至可以等待一分钟,但什么也没有发生,它只是卡在初始化中。没有异常,没有错误信息。我在 UI 线程上运行此代码,但当我在另一个线程上调用此方法时,发生了同样的事情。

有人经历过这种行为吗?有任何想法吗?

c# wpf webview2

7
推荐指数
1
解决办法
7554
查看次数

WebView2文件下载通知框

我有一个看起来很愚蠢的问题。我已经在 WebView2 应用程序上工作了几天。在今天之前,当我在应用程序中下载文件时,我会在左下角看到通常的下载通知框。现在我在右上角看到了这个弹出窗口。我不知道发生了什么变化。我已经回到旧代码,在其中我没有看到这种行为,但它也在那里执行。我需要将其移回左下角。有谁知道我做了什么或如何改回来?谢谢你的帮助。凯文.

在此输入图像描述

webview2

7
推荐指数
1
解决办法
3387
查看次数

window.postMessage VS window.chrome.webview.postMessage

有何window.postMessage不同 window.chrome.webview.postMessage

我在 a 的上下文中使用它WebView2(在 .NET/WPF 应用程序中)。我们正在WebView2中加载第三方网页。该网页会触发window.postMessage我们需要捕获的某些数据。根据文档,WebView2WebMessageReceived在加载的页面触发时引发事件window.chrome.webview.postMessage,这是正确的。另一方面,它似乎并不尊重window.postMessage(没有WebMessageReceived被解雇)。

这两个API是不同的吗?哪一个是标准的(如 HTML5)?window.postMessage由于我无法要求第三方网站更改其代码以使用 .NET,因此如何捕获.NET 应用程序中的事件window.chrome.webview.postMessage

wpf postmessage chromium webview2

7
推荐指数
1
解决办法
1万
查看次数

WPF WebView2 - 无法禁用上下文菜单

环境Windows 10 Pro - ver. 1903VS2019 latest versionWPF Core

当我在WebView2HTML控件内显示的页面上有手动控件时,我可以通过简单地将属性添加到标记来禁用上下文菜单。但在大多数情况下,网页是根据用户交互(用户导航到哪个页面等)显示的。oncontextmunu={return false;}<body>

问题:如何禁用 WebView2 控件中显示的网页的上下文菜单?

评论

  1. 我注意到,在某些情况下,当 JavaScript 与网页一起加载时,即使我以编程方式将此属性添加到加载页面的标签oncontextmunu={return false;}中,也不会禁用上下文菜单。body我看到Microsoft.Web.WebView2.Core.CoreWebView2SettingsAreDefaultContextMenusEnabled类的属性,但无法识别.VS2019WebView2
  2. WebBrowser在WPF 的旧控件上也存在类似的问题,如此处此处所述,并且 WebView2 也有类似的情况。
  3. 根据此Microsoft 链接的第 5 项,问题已得到解决。C++但那里的解决方案似乎与我使用时有关C#。也许,还有另一种选择。

c# wpf webview2

6
推荐指数
1
解决办法
7827
查看次数

如何在 WPF WebView2 中禁用 CORS

我正在开发一个使用 .Net5/WPF 显示 WebView2 的应用程序。
我想禁用 CORS。
我已经安装了 Chromium Edge Canary 86.0.607.0。
在 Edge 中,可以通过将以下参数添加到快捷方式来禁用 CORS。

--disable-web-security --user-data-dir="C://Chrome dev session"

我也想禁用 WebView2。

c# wpf .net-core .net-5 webview2

6
推荐指数
2
解决办法
6319
查看次数

如何从 WebView2 中的 ExecuteScriptAsync 获取同步返回

.NET、WinForms。

\n

调用是从 UI 线程触发的(按钮 - 单击)。ExecuteScriptAsync 的返回应继续同步处理,即它们应再次与调用上下文同步。我在这里失败了。

\n

我尝试过例如:

\n
private void buttonTest1_Click(object sender, EventArgs e) {\n        MessageBox.Show(GetMathResult());\n    }\n\n    String GetMathResult() {\n        // a) Application freezes\n        //var result = webView.ExecuteScriptAsync("Math.sin(Math.PI/2)").GetAwaiter().GetResult();\n        //return result;\n\n        // b) return null\n        //String result = null;\n        //Task task = new Task(async () => { result = await webView.ExecuteScriptAsync("Math.sin(Math.PI/2)"); }); \n        //task.RunSynchronously();\n        //return result;\n\n        // c) Excepion: // InvalidCastException: Das COM-Objekt des Typs "System.__ComObject" kann nicht in den Schnittstellentyp "Microsoft.Web.WebView2.Core.Raw.ICoreWebView2Controller" umgewandelt werden. Dieser Vorgang konnte nicht …
Run Code Online (Sandbox Code Playgroud)

.net winforms async-await webview2

6
推荐指数
2
解决办法
2万
查看次数

将Webview2 Source直接设置为二进制流

我的应用程序中有一个Webview2控件,用于查看PDF文档。
该应用程序还可以在 MS SQL Server PDF 数据中存储和读取数据。

目前,我正在从 SQL 检索二进制数据,将它们转换为临时文件到磁盘并设置:

webview2.source = New Uri("file://" + filename)  
Run Code Online (Sandbox Code Playgroud)

到目前为止,工作正常,但我当然希望在不写入和读取磁盘的情况下完成这项工作。

有没有办法在不访问磁盘的情况下执行相同的操作?

更新(按照建议),我尝试过的。为了更好地理解部分代码:

                Dim fieldOrdinal = reader.GetOrdinal(ColumnName)
                reader.Read()
                Dim blob = New Byte(reader.GetBytes(fieldOrdinal, 0, Nothing, 0, 0) - 1) {}
                reader.GetBytes(fieldOrdinal, 0, blob, 0, blob.Length)

                Dim pdfBase64 As String = Convert.ToBase64String(blob)
                Dim html As String = "<!DOCTYPE html><html><head></head><body><div>" & $"<iframe width=100% height=500 src=\" & Chr(&H22) & "data:Application/pdf;base64,{pdfBase64}\" & Chr(&H22) & ">" & "</iframe></div></body></html>"
Run Code Online (Sandbox Code Playgroud)

webview2控件显示一个框架,但没有内容

最终更新:这里是(正确的)VB 翻译和工作代码:

Dim html As String = "<!DOCTYPE …
Run Code Online (Sandbox Code Playgroud)

c# vb.net sql-server winforms webview2

6
推荐指数
1
解决办法
2668
查看次数

如何从控制台应用程序截取 WebView2 的屏幕截图

我正在尝试从控制台应用程序获取 WebView2 输出的屏幕截图。该应用程序是从非交互式 Windows 服务调用的。控制台应用程序的目的是从 WPF 控件生成图形文件。我目前可以对绘制图表等图形的用户控件执行此操作。我的控制台应用程序是一个没有用户界面的 WPF 应用程序。我正在尝试对 WebView 执行相同的操作,但是当隐藏控件时,对 EnsureCoreWebView2Async 的调用会挂起。看来控件必须是可见的。那么一切都很好。有没有办法在没有实际显示控件的情况下让它工作?

XAML

<Window x:Class="WebView2WPFHidden.MainWindow"
    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:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
    xmlns:local="clr-namespace:WebView2WPFHidden"        
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800"
    Visibility="Hidden">
<Grid>
    <wv2:WebView2 Name="webView"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

代码隐藏

    public MainWindow()
    {
        InitializeComponent();

        _ = InitializeAsync();
    }

    private async Task InitializeAsync()
    {
        await webView.EnsureCoreWebView2Async(null);
        webView.NavigationCompleted += WebView_NavigationCompleted;
        webView.Source = new Uri("https://www.microsoft.com");
    }

    private void WebView_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e)
    {
        try
        {
            _ = SaveScreenshot((int)Width, (int)Height);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    private async Task SaveScreenshot(int …
Run Code Online (Sandbox Code Playgroud)

wpf webview2

6
推荐指数
1
解决办法
2404
查看次数