WPF Prism MVVM技巧【用注入方式在不同项目中访问主窗体(MainWindow)】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

目的是想在Prism MVVM中通过注入的方式来全局访问主窗体(MainWindow)。

一、项目结构图

项目创建

创建一个Prism Full App(WPF)项目,在Services项目文件夹中创建一个Public_Global项目并创建一个Global.cs类用来注入。

流程步骤

  1. Dongming_BigTest.App.xmal.cs中注入Public_Global.Global类
  2. Dongming_BigTest.App.xmal.cs中给protected override Window CreateShell()将实例化后的主窗体赋值给Global.MainWindow
  3. 在Dongming_BigTest.Modules.ModuleName.ViewModels.ViewAViewModel中获取主窗体。

二、代码

1.Global.cs 全局类

using System.Windows.Input;
using System.Drawing;
namespace Public_Global
{
    /// <summary>
    /// 全局变量
    /// </summary>
    public  class Global
    {     
        public static object _SetMainWindow;
        /// <summary>
        /// 设置窗口
        /// </summary>
        public static object SetMainWindow
        {
            get { return _SetMainWindow; }
            set { _SetMainWindow = value;  }
        }
        object _mainWindow;
        /// <summary>
        /// 全局窗口变量
        /// </summary>
        public object MainWindow
        {
            get { return _mainWindow; }
            set { _mainWindow = value; Changeed(value); }
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        public  Global()
        {
            MainWindow = SetMainWindow;
        }
        /// <summary>
        /// 当MainWindow属性改变时
        /// </summary>
        /// <param name="value"></param>
        static void Changeed(object value)
        {
            SetMainWindow = value;
        }
    }
}

2.App.cs 程序在这里注入Global

using Dongming_BigTest.Modules.ModuleName;
using Dongming_BigTest.Services;
using Dongming_BigTest.Services.Interfaces;
using Dongming_BigTest.Views;
using Prism.Ioc;
using Prism.Modularity;
using Public_Global;
using System.Windows;
namespace Dongming_BigTest
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App
    {
       public static Window _MainWindow;
        protected override Window CreateShell()
        {
            Global global = new Global();//创建对像
         _MainWindow = Container.Resolve<MainWindow>();
            global.MainWindow = _MainWindow;//把_MainWindow赋值给global.MainWindow 
            return _MainWindow;
        }
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.Register<Global>();//注入Global类
            containerRegistry.RegisterSingleton<IMessageService, MessageService>();
            //containerRegistry.RegisterDialog
        }
        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
        {
            moduleCatalog.AddModule<ModuleNameModule>();
        }
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            this.ShutdownMode = ShutdownMode.OnMainWindowClose;
        }
    }
}

3.ViewAViewModel.cs在此类中使用Global.MainWindow

using Dongming_BigTest.Core.Mvvm;
using Dongming_BigTest.Services.Interfaces;
using Prism.Regions;
using Public_Global;
using System.Windows;
namespace Dongming_BigTest.Modules.ModuleName.ViewModels
{
    public class ViewAViewModel : RegionViewModelBase
    {
        private string _message;
        public string Message
        {
            get { return _message; }
            set { SetProperty(ref _message, value); }
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="regionManager"></param>
        /// <param name="messageService"></param>
        /// <param name="global"></param>
        public ViewAViewModel(IRegionManager regionManager, IMessageService messageService, Global global ) :
            base(regionManager)
        {
            //这里的 global 是一个新的实例 与 APP中的不是同一个,
            //但是在构建时用静态的SetMainWindow给MainWindow重新赋值了
            //所以在这里可以获到window的实例
            Window window = global.MainWindow as Window;
            window.Opacity = 0.3;//窗口透明度设置为0.3
            Message = messageService.GetMessage();
        }
        public override void OnNavigatedTo(NavigationContext navigationContext)
        {
        }
    }
}

总结

通过本文的方法可以在程序的所有页面都可以调用主窗体的内容。希望能对大家有绑助,如果谁有更好的方法可以给我留言相互学习,谢谢了。
源码下载

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值