调用 window.open 时如何在 WPF/WebView2 应用程序中创建自定义窗口?

Posted

技术标签:

【中文标题】调用 window.open 时如何在 WPF/WebView2 应用程序中创建自定义窗口?【英文标题】:How to create custom windows in a WPF / WebView2 application when window.open is called? 【发布时间】:2021-12-03 06:23:05 【问题描述】:

我有一个 Webview2 应用程序,它需要能够拦截 window.open 调用并以某种方式配置生成的窗口(例如,使其不可调整大小、无框、删除出现的默认位置栏等)。

到目前为止,我知道我需要拦截 NewWindowRequested 事件并将 EventArgsNewWindow 属性分配给新的 Webview2 控件,但是我无法让它工作,而且我没有'没有找到任何文档列出尝试这样做的示例。

我正在使用 WPF。

还请注意,我对 WPF 和 WebView2 都是新手,所以也许我正在做的事情完全没有意义。

这大概是我的代码:

public static async void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e) 
    var obj = e.GetDeferral(); // I think I need to do this to ensure that the resulting window ends up as the return of window.open
    var win = new System.Windows.Window(); // create my WPF window
    var w = new WebView2(); // create my Webview control
    win.Content = w; // site the Webview control?

    await w.EnsureCoreWebView2Async(MainWindow.Webview.CoreWebView2.Environment);

    e.NewWindow = w.CoreWebView2;
    obj.Complete();

我看到的问题是EnsureCoreWebView2Async 返回的Task 永远不会完成。

我的设置是否正确?为什么EnsureCoreWebView2Async 不解析?

【问题讨论】:

试试:public async void CoreWebView2_NewWindowRequested 然后你可以await 但是async void 中的异常不会导致进程崩溃吗?我的意思是我想我可以用 try/catch 包装所有东西,但有点烦人;也许这就是我会做的。 @PoulBak async void 是专门为事件处理程序设计的,只能用于此目的。如果你不await,那就是“一劳永逸”。 @PoulBak 好的,我会更新我的代码。虽然它不能解决我的问题 @PoulBak 似乎调用win.Show() 使其工作并且任务完成 【参考方案1】:

看来我必须致电win.Show() 才能完成EnsureCoreWebView2Async Task

也许我真的只想在 webview 内容加载后才显示窗口,但这至少是一个好的开始。

【讨论】:

以上是关于调用 window.open 时如何在 WPF/WebView2 应用程序中创建自定义窗口?的主要内容,如果未能解决你的问题,请参考以下文章

window.open()打开一个子页面,如何在子页面关闭时刷新父页面?

在C#后台调用window.open,,并且传递参数。。怎么写 啊?? 我是菜鸟,请详细点

Javascript - 通过 s-s-rS 2008 R2 调用时,window.open 在 IE 中不起作用

javascript window.open [重复]

js打开新窗口并且不被拦截

如何将身份验证标头添加到 $window.open