调用 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
事件并将 EventArgs
的 NewWindow
属性分配给新的 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,,并且传递参数。。怎么写 啊?? 我是菜鸟,请详细点