WinUI3 C#浏览器开发:CoreWebView2.NewWindowRequested空引用异常排查
我正在使用WinUI 3 C#开发浏览器应用,发现触发新标签页请求时会打开新的Edge窗口,因此编写了处理该事件的WebView_NewWindowRequested方法:
public static void WebView_NewWindowRequested(CoreWebView2 sender, CoreWebView2NewWindowRequestedEventArgs e) { MainWindow.NewTab(new(e.Uri)); }
随后通过以下代码绑定事件:
Variables.webViews[index].CoreWebView2.NewWindowRequested += WebView_NewWindowRequested;
但运行时抛出System.NullReferenceException异常:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
而绑定NavigationStarting、NavigationCompleted事件的类似代码却能正常运行:
Variables.webViews[index].NavigationStarting += WebView_NavigationStarting; Variables.webViews[index].NavigationCompleted += WebView_NavigationCompleted;
异常原因
核心问题是**CoreWebView2实例未完成初始化就被访问**。
NavigationStarting、NavigationCompleted是WebView2控件本身的事件,无需依赖CoreWebView2对象即可绑定;但NewWindowRequested是CoreWebView2专属的事件,必须等CoreWebView2完成初始化后才能访问它的成员。
WinUI 3中WebView2的CoreWebView2属性默认是null,只有在控件完成初始化(比如主动调用EnsureCoreWebView2Async(),或者控件自动加载完成)后,该属性才会被赋值。直接提前访问自然会触发空引用异常。
解决方法
方法一:主动确保CoreWebView2初始化
先调用EnsureCoreWebView2Async()等待初始化完成,再绑定事件:
await Variables.webViews[index].EnsureCoreWebView2Async(); Variables.webViews[index].CoreWebView2.NewWindowRequested += WebView_NewWindowRequested;
方法二:监听CoreWebView2Initialized事件
通过CoreWebView2Initialized事件判断初始化完成时机,在事件回调中绑定目标事件:
Variables.webViews[index].CoreWebView2Initialized += (sender, args) => { var webView = (WebView2)sender; webView.CoreWebView2.NewWindowRequested += WebView_NewWindowRequested; };
内容的提问来源于stack exchange,提问作者user21603351

