Prism Library UWP应用多视图实现及空引用异常解决
在Prism Library for UWP中正确实现多视图的解决方案
嘿,我来帮你搞定这个多视图的NullReferenceException问题!你遇到的异常大概率是因为直接新建的Frame没有接入Prism的导航体系和依赖注入容器,导致视图或视图模型初始化时出现空引用。咱们来一步步修正并实现正确的多视图功能:
核心问题分析
你原来的代码里直接new Frame(),这个Frame完全脱离了Prism的容器管理。当调用frame.Navigate(typeof(ScreenCapture))时,Prism无法为ScreenCapture视图注入对应的视图模型或其他依赖项,进而触发空引用异常。
修正后的实现代码
async void ExecuteNewWindow() { CoreApplicationView newView = CoreApplication.CreateNewView(); int newViewId = 0; await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { // 获取Prism应用实例,拿到依赖注入容器 var prismApp = (PrismApplication)App.Current; var container = prismApp.Container; // 从容器中解析Frame,确保它关联Prism的导航服务和依赖注入 var frame = container.Resolve<Frame>(); // 导航到目标视图,Prism会自动处理视图模型的注入与初始化 frame.Navigate(typeof(ScreenCapture)); Window.Current.Content = frame; Window.Current.Activate(); newViewId = ApplicationView.GetForCurrentView().Id; }); bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId); }
关键注意事项
- 容器注册确认:确保你的
ScreenCapture视图已经被Prism正确注册。如果是使用Prism默认的视图发现机制,它会自动注册;如果是手动注册,要确认在容器中已经添加了该视图的注册项。 - 参数传递:如果需要给
ScreenCapture传递导航参数,直接在Navigate方法中添加参数即可:frame.Navigate(typeof(ScreenCapture), yourParameter),Prism会自动将参数传递到视图模型的OnNavigatedTo方法中。 - 导航服务的替代用法:如果你习惯使用Prism的
INavigationService,也可以在新视图的上下文里从容器解析导航服务,再调用导航方法,效果是一致的。
内容的提问来源于stack exchange,提问作者Edward




