根据 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) 在我的 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) 我正在尝试在 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 线程上运行此代码,但当我在另一个线程上调用此方法时,发生了同样的事情。
有人经历过这种行为吗?有任何想法吗?
我有一个看起来很愚蠢的问题。我已经在 WebView2 应用程序上工作了几天。在今天之前,当我在应用程序中下载文件时,我会在左下角看到通常的下载通知框。现在我在右上角看到了这个弹出窗口。我不知道发生了什么变化。我已经回到旧代码,在其中我没有看到这种行为,但它也在那里执行。我需要将其移回左下角。有谁知道我做了什么或如何改回来?谢谢你的帮助。凯文.
有何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
?
环境:Windows 10 Pro - ver. 1903
,VS2019 latest version
,WPF Core
当我在WebView2HTML
控件内显示的页面上有手动控件时,我可以通过简单地将属性添加到标记来禁用上下文菜单。但在大多数情况下,网页是根据用户交互(用户导航到哪个页面等)显示的。oncontextmunu={return false;}
<body>
问题:如何禁用 WebView2 控件中显示的网页的上下文菜单?
评论:
oncontextmunu={return false;}
中,也不会禁用上下文菜单。body
我看到Microsoft.Web.WebView2.Core.CoreWebView2SettingsAreDefaultContextMenusEnabled
类的属性,但无法识别.VS2019
WebView2
WebBrowser
在WPF 的旧控件上也存在类似的问题,如此处和此处所述,并且 WebView2 也有类似的情况。C++
但那里的解决方案似乎与我使用时有关C#
。也许,还有另一种选择。我正在开发一个使用 .Net5/WPF 显示 WebView2 的应用程序。
我想禁用 CORS。
我已经安装了 Chromium Edge Canary 86.0.607.0。
在 Edge 中,可以通过将以下参数添加到快捷方式来禁用 CORS。
--disable-web-security --user-data-dir="C://Chrome dev session"
我也想禁用 WebView2。
.NET、WinForms。
\n调用是从 UI 线程触发的(按钮 - 单击)。ExecuteScriptAsync 的返回应继续同步处理,即它们应再次与调用上下文同步。我在这里失败了。
\n我尝试过例如:
\nprivate 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) 我的应用程序中有一个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) 我正在尝试从控制台应用程序获取 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) webview2 ×10
c# ×5
wpf ×5
winforms ×3
.net ×2
.net-5 ×1
.net-core ×1
async-await ×1
chromium ×1
postmessage ×1
sql-server ×1
vb.net ×1
webview ×1