C# 使用Prism和Unity在不同模块中切换视图

C# 使用Prism和Unity在不同模块中切换视图,c#,wpf,unity-container,prism,C#,Wpf,Unity Container,Prism,我想从模块视图导航到模块视图。如何在模块之间实现导航 在我使用Prism框架的应用程序中,我有两个模块 模块a 模块B 我在引导程序中配置了两个模块,如下所示: protected override void ConfigureModuleCatalog() { base.ConfigureModuleCatalog(); ModuleCatalog moduleCatalog = (ModuleCatalog)this.Mo

我想从模块视图导航到模块视图。如何在模块之间实现导航

在我使用Prism框架的应用程序中,我有两个模块

  • 模块a
  • 模块B
我在引导程序中配置了两个模块,如下所示:

protected override void ConfigureModuleCatalog()
        {
            base.ConfigureModuleCatalog();

            ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
            moduleCatalog.AddModule(typeof(ModuleA));
            moduleCatalog.AddModule(typeof(ModuleB));
        }
public class ModuleA : IModule
    {

        private readonly IRegionManager  regionManager;
        private readonly IUnityContainer container;

        public StaffModule(IUnityContainer container, IRegionManager regionManager)
        {
            this.container     = container;
            this.regionManager = regionManager;
        }

        public void Initialize()
        {
            this.regionManager.RegisterViewWithRegion("MainRegion", () => this.container.Resolve<StaffView>());
         }           
    }


public class AccountModule : IModule
    {
        private readonly IRegionManager  regionManager;
        private readonly IUnityContainer container;

        public AccountModule(IUnityContainer container, IRegionManager regionManager)
        {
            this.container     = container;
            this.regionManager = regionManager;
        }

        public void Initialize()
        {
             container.RegisterType<object, AccountView>("AccountView");
            ////this.regionManager.RegisterViewWithRegion("MainRegion", () => this.container.Resolve<AccountView>());
        }
    }
container.RegisterTypeForNavigation<AccountView>();
我在我的模块a模块b中注册我的视图,如下所示:

protected override void ConfigureModuleCatalog()
        {
            base.ConfigureModuleCatalog();

            ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
            moduleCatalog.AddModule(typeof(ModuleA));
            moduleCatalog.AddModule(typeof(ModuleB));
        }
public class ModuleA : IModule
    {

        private readonly IRegionManager  regionManager;
        private readonly IUnityContainer container;

        public StaffModule(IUnityContainer container, IRegionManager regionManager)
        {
            this.container     = container;
            this.regionManager = regionManager;
        }

        public void Initialize()
        {
            this.regionManager.RegisterViewWithRegion("MainRegion", () => this.container.Resolve<StaffView>());
         }           
    }


public class AccountModule : IModule
    {
        private readonly IRegionManager  regionManager;
        private readonly IUnityContainer container;

        public AccountModule(IUnityContainer container, IRegionManager regionManager)
        {
            this.container     = container;
            this.regionManager = regionManager;
        }

        public void Initialize()
        {
             container.RegisterType<object, AccountView>("AccountView");
            ////this.regionManager.RegisterViewWithRegion("MainRegion", () => this.container.Resolve<AccountView>());
        }
    }
container.RegisterTypeForNavigation<AccountView>();
公共类模块a:IModule
{
专用只读IRegionManager regionManager;
专用只读IUnityContainer容器;
公共StaffModule(IUnityContainer容器、IRegionManager区域管理器)
{
this.container=容器;
this.regionManager=regionManager;
}
公共无效初始化()
{
this.regionManager.RegisterViewWithRegion(“MainRegion”,()=>this.container.Resolve());
}           
}
公共类AccountModule:IModule
{
专用只读IRegionManager regionManager;
专用只读IUnityContainer容器;
公共帐户模块(IUnityContainer容器、IRegionManager区域管理器)
{
this.container=容器;
this.regionManager=regionManager;
}
公共无效初始化()
{
container.RegisterType(“AccountView”);
////this.regionManager.RegisterViewWithRegion(“MainRegion”,()=>this.container.Resolve());
}
}
当我从模块a中的StaffView单击按钮时,我想导航到模块b中的AccountView。这是我的导航代码

private void LodeViewfromModule()
{
   IUnityContainer unityContainer = ServiceLocator.Current.GetInstance<IUnityContainer>();
   var regionManager=unityContainer.Resolve<IRegionManager>();
   var uri = new Uri("pack://application:,,,/PrismAuto.Account;component/AccountView.xaml", UriKind.RelativeOrAbsolute);
   regionManager.RequestNavigate("MainRegion", uri);
}
private void LodeViewfromModule()
{
IUnityContainer unityContainer=ServiceLocator.Current.GetInstance();
var regionManager=unityContainer.Resolve();
var uri=新的uri(“pack://application:,,,/PrismAuto.Account;component/AccountView.xaml“,UriKind.RelativeOrAbsolute);
RequestNavigate(“MainRegion”,uri);
}
但它表明:

对象异常


请任何人帮助我解决此问题。

您正在使用以下方式注册导航视图:

container.RegisterType<object, AccountView>("AccountView");
此外,如果您使用的是Prism 6,则Prism.Unity命名空间中有一个扩展方法,用于注册视图以进行导航,如下所示:

protected override void ConfigureModuleCatalog()
        {
            base.ConfigureModuleCatalog();

            ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
            moduleCatalog.AddModule(typeof(ModuleA));
            moduleCatalog.AddModule(typeof(ModuleB));
        }
public class ModuleA : IModule
    {

        private readonly IRegionManager  regionManager;
        private readonly IUnityContainer container;

        public StaffModule(IUnityContainer container, IRegionManager regionManager)
        {
            this.container     = container;
            this.regionManager = regionManager;
        }

        public void Initialize()
        {
            this.regionManager.RegisterViewWithRegion("MainRegion", () => this.container.Resolve<StaffView>());
         }           
    }


public class AccountModule : IModule
    {
        private readonly IRegionManager  regionManager;
        private readonly IUnityContainer container;

        public AccountModule(IUnityContainer container, IRegionManager regionManager)
        {
            this.container     = container;
            this.regionManager = regionManager;
        }

        public void Initialize()
        {
             container.RegisterType<object, AccountView>("AccountView");
            ////this.regionManager.RegisterViewWithRegion("MainRegion", () => this.container.Resolve<AccountView>());
        }
    }
container.RegisterTypeForNavigation<AccountView>();
container.RegisterTypeForNavigation();

您正在使用以下方式注册视图以进行导航:

container.RegisterType<object, AccountView>("AccountView");
此外,如果您使用的是Prism 6,则Prism.Unity命名空间中有一个扩展方法,用于注册视图以进行导航,如下所示:

protected override void ConfigureModuleCatalog()
        {
            base.ConfigureModuleCatalog();

            ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
            moduleCatalog.AddModule(typeof(ModuleA));
            moduleCatalog.AddModule(typeof(ModuleB));
        }
public class ModuleA : IModule
    {

        private readonly IRegionManager  regionManager;
        private readonly IUnityContainer container;

        public StaffModule(IUnityContainer container, IRegionManager regionManager)
        {
            this.container     = container;
            this.regionManager = regionManager;
        }

        public void Initialize()
        {
            this.regionManager.RegisterViewWithRegion("MainRegion", () => this.container.Resolve<StaffView>());
         }           
    }


public class AccountModule : IModule
    {
        private readonly IRegionManager  regionManager;
        private readonly IUnityContainer container;

        public AccountModule(IUnityContainer container, IRegionManager regionManager)
        {
            this.container     = container;
            this.regionManager = regionManager;
        }

        public void Initialize()
        {
             container.RegisterType<object, AccountView>("AccountView");
            ////this.regionManager.RegisterViewWithRegion("MainRegion", () => this.container.Resolve<AccountView>());
        }
    }
container.RegisterTypeForNavigation<AccountView>();
container.RegisterTypeForNavigation();

您是否尝试导航到新Uri(“AccountView”,UriKind.Relative)?毕竟,您已经在该“名称”下注册了它。您是否尝试导航到
新Uri(“AccountView”,UriKind.Relative)
?毕竟你是用这个“名字”注册的。非常感谢你的回答。非常感谢你的回答。