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