使用Prism管理WPF应用程序中的视图是否可以接受?

使用Prism管理WPF应用程序中的视图是否可以接受?,wpf,views,unity-container,prism,Wpf,Views,Unity Container,Prism,我正在使用Prism编写一个WPF MVVM应用程序。几天前,我询问了管理不同视图的最佳实践,没有得到太多反馈。从某种意义上说,我已经想出了一个似乎可行的系统,但我想确保我不会在路上被咬 我按照上的教程进行了shell设置,并确信我的模块注册良好 但是,在这些教程中,没有一个视图被给定区域内的不同视图替换的示例。总的来说,似乎很难找到一个好的例子。所以,今天我推出了自己的解决方案 基本上,模块有一个跟踪当前视图的控制器,当用户想要切换视图时,它调用Regions.Remove命令,然后调用add

我正在使用Prism编写一个WPF MVVM应用程序。几天前,我询问了管理不同视图的最佳实践,没有得到太多反馈。从某种意义上说,我已经想出了一个似乎可行的系统,但我想确保我不会在路上被咬

我按照上的教程进行了shell设置,并确信我的模块注册良好

但是,在这些教程中,没有一个视图被给定区域内的不同视图替换的示例。总的来说,似乎很难找到一个好的例子。所以,今天我推出了自己的解决方案

基本上,模块有一个跟踪当前视图的控制器,当用户想要切换视图时,它调用Regions.Remove命令,然后调用add命令以将其替换为当前视图。似乎必须有一个更优雅的解决方案来在不同的注册视图之间切换,但我还没有找到它

初始化模块时,模块的所有不同可能视图都会注册到Unity容器中

控制器和视图切换功能如下所示:

namespace HazardModule
{
    public class HazardController : IHazardController
    {

        private object CurrentView;
        public IRegionManager RegionManager { get; set; }
        private IUnityContainer _container;

        public HazardController(IUnityContainer container)
        {
            _container = container;
        }

        /// <summary>
        /// Switches the MainRegion view to a different view
        /// </summary>
        /// <typeparam name="T">The class of the view to switch to</typeparam>
        public void SiwthToView<T>()
        {
            if (CurrentView != null)
            {
                RegionManager.Regions["MainRegion"].Remove(CurrentView);
            }
            CurrentView = _container.Resolve<T>();
            RegionManager.Regions["MainRegion"].Add(CurrentView);
        }

    }
}
名称空间模块
{
公共类危险控制器:IHazardController
{
私有对象视图;
公共IRegionManager区域管理器{get;set;}
专用IUnityContainer\u容器;
公共危险控制器(IUnityContainer容器)
{
_容器=容器;
}
/// 
///将MainRegion视图切换到其他视图
/// 
///要切换到的视图的类
公共void SiwthToView()
{
如果(CurrentView!=null)
{
RegionManager.Regions[“MainRegion”]。删除(CurrentView);
}
CurrentView=_container.Resolve();
RegionManager.Regions[“MainRegion”].Add(当前视图);
}
}
}

任何反馈或其他更好的解决方案都将不胜感激。

我有几乎相同的方法,一位比我更有棱镜经验的同事也是如此

基本上,我有一个ViewController类,它是ViewModelBase类中的一个属性。这使我的所有ViewModels都可以一次性访问它。然后在我的ViewController类中,我有一些显示管理方法。这种方法的正确性可能是有争议的,但我发现它在我的案例中非常有效

    public TView ShowViewInRegion<TView>(string regionName, string viewName, bool removeAllViewsFromRegion)
    {
        var region = regionManager.Regions[regionName];

        var view = region.GetView(viewName) ?? container.Resolve<TView>();

        if (removeAllViewsFromRegion)
        {
            RemoveViewsFromRegion(region);
        }

        region.Add(view, viewName);
        region.Activate(view);

        if (regionName == RegionNames.OverlayRegion)
        {
            eventAggregator.GetEvent<PopupWindowVisibility>().Publish(true);
        }

        return (TView)view;
    }

    public void RemoveViewsFromRegion(string regionName)
    {
        RemoveViewsFromRegion(regionManager.Regions[regionName]);
    }

    private void RemoveViewsFromRegion(IRegion region)
    {
        for (int i = 0; i < region.Views.Count() + i; i++)
        {
            var view = region.Views.ElementAt(0);
            region.Remove(view);
        }

        if (region.Name == RegionNames.OverlayRegion)
        {
            eventAggregator.GetEvent<PopupWindowVisibility>().Publish(false);
        }
    }

    private static void DeactivateViewsInRegion(IRegion region)
    {
        for (var i = 0; i < region.ActiveViews.Count(); i++)
        {
            var view = region.ActiveViews.ElementAt(i);
            region.Deactivate(view);
        }
    }
public TView ShowViewInRegion(string regionName、string viewName、bool removeAllViewsFromRegion)
{
var region=regionManager.Regions[regionName];
var view=region.GetView(viewName)??container.Resolve();
如果(从区域移除所有视图)
{
从区域(region)移除视图;
}
添加(视图、视图名称);
区域。激活(视图);
if(regionName==RegionNames.OverlayRegion)
{
eventAggregator.GetEvent().Publish(true);
}
返回(TView)视图;
}
public void RemoveViewsFromRegion(字符串regionName)
{
RemoveViewsFromRegion(regionManager.Regions[regionName]);
}
private void RemoveViewsFromRegion(IRegion region)
{
对于(int i=0;i
然后,每当我需要切换视图或任何我可以从ViewModel调用的内容时

    public void ExecuteCreateUserCommand()
    {
        ViewController.ShowViewInRegion<IUserCreateView>(RegionNames.ContentRegion, ViewNames.UserCreateView, true);
    }
public void ExecuteCreateUserCommand()
{
ViewController.ShowViewInRegion(RegionNames.ContentRegion,ViewNames.UserCreateView,true);
}