You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动