首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用Prism管理WPF应用程序中的视图时,这是可接受的做法吗?

在使用Prism管理WPF应用程序中的视图时,这是可接受的做法吗?
EN

Stack Overflow用户
提问于 2010-08-20 09:37:24
回答 1查看 799关注 0票数 0

我正在使用Prism编写一个WPF MVVM应用程序。几天前,我询问了管理不同视图的最佳实践,但没有得到很多反馈。因此,我想出了一个似乎可以工作的系统,但我想确保我不会被咬到。

我按照http://development-guides.silverbaylabs.org/上的教程进行了shell设置,并且确信我的模块已经被很好地注册了。

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

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

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

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

代码语言:javascript
复制
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);
        }

    }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-07 14:35:05

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

基本上,我有一个ViewController类,它是我的ViewModelBase类中的一个属性。这使得我所有的ViewModels都可以一次性访问它。然后,在我的ViewController类中,我有一些显示管理方法。这种方法的正确性可能是有争议的,但我发现它在我的情况下工作得很好。

代码语言:javascript
复制
    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);
        }
    }

然后,每当我需要切换视图或任何我可以从ViewModel调用的东西时

代码语言:javascript
复制
    public void ExecuteCreateUserCommand()
    {
        ViewController.ShowViewInRegion<IUserCreateView>(RegionNames.ContentRegion, ViewNames.UserCreateView, true);
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3527608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档