JohnSon:ModuleManager动态加载模块

[Export(typeof(VMShell))]
    [PartCreationPolicy(CreationPolicy.Shared)]
    public class VMShell : NotificationObject
    {
        IEventAggregator eventAggregator;
        Lazy<IModuleManager> lazyModuleManager;
        IModuleManager moduleManager = null;

        [ImportingConstructor]
        public VMShell(IEventAggregator agg, Lazy<IModuleManager> module)
        {
            eventAggregator = agg;
            lazyModuleManager = module;

            ShowLoginView();
        }

        private void ShowLoginView()
        {
            //初始化ModuleManager,加载事件等
            InitLoginManager();
            //根据模块名取得模块信息
            ModuleCatalog moduleCatalog = ServiceLocator.Current.GetInstance<ModuleCatalog>();
            if (moduleCatalog == null) return;
            ModuleInfo moduleInfo = moduleCatalog.Modules.FirstOrDefault(p => p.ModuleName == "ModuleLogin");
            if (moduleInfo == null) return;
            if (moduleInfo.State == ModuleState.Initialized)
            {
                //显示当前主视图
                ShowLogin();
            }
            else if (moduleManager != null)
            {
                moduleManager.LoadModule("ModuleLogin");
            }
            string status = moduleInfo.State.ToString();
        }

        private void InitLoginManager()
        {
            if (!lazyModuleManager.IsValueCreated)
            {
                moduleManager = lazyModuleManager.Value;
                moduleManager.ModuleDownloadProgressChanged += new EventHandler<ModuleDownloadProgressChangedEventArgs>(LoginModuleProgressChanged);
                moduleManager.LoadModuleCompleted += new EventHandler<LoadModuleCompletedEventArgs>(LoadModuleCompleted);
            }
        }

        void LoginModuleProgressChanged(object sender, ModuleDownloadProgressChangedEventArgs e)
        {
            //ModuleLoadedPercent = e.ProgressPercentage;
            //if (ModuleLoadedPercent > 0 && ModuleLoadedPercent < 100)
            //    IsBusy = true;
            //else
            //    IsBusy = false;
        }

        void LoadModuleCompleted(object sender, LoadModuleCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                ShowLogin();
            }
        }

        private void ShowLogin()
        {
            UserControl loginView = ServiceLocator.Current.GetInstance<UserControl>("ViewLogin");
            if (loginView != null)
            {
                eventAggregator.GetEvent<ModuleEvent>().Publish(loginView);
            }
        }
    }

原文地址:https://www.cnblogs.com/iwangjun/p/2385812.html