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

这篇具有很好参考价值的文章主要介绍了WPF Prism MVVM技巧【用注入方式在不同项目中访问主窗体(MainWindow)】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


前言

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

一、项目结构图

WPF 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)
        {
        }
    }
}

总结

通过本文的方法可以在程序的所有页面都可以调用主窗体的内容。希望能对大家有绑助,如果谁有更好的方法可以给我留言相互学习,谢谢了。
源码下载文章来源地址https://www.toymoban.com/news/detail-448597.html

到了这里,关于WPF Prism MVVM技巧【用注入方式在不同项目中访问主窗体(MainWindow)】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 现代WPF界面轻松实现:探秘轻量级WPFUI库,MVVM与依赖注入一体化

      概述: 一款名为WPFUI的轻量级开源库,为WPF应用程序提供现代化界面。支持MVVM和 Microsoft.Extensions.DependencyInjection,简单上手。无第三方依赖,内置两套皮肤,可自定义样式。适用于一般应用场景,不受MVVM框架限制。通过简单的引用和配置,快速构建现代化WPF应用,提升用户

    2024年02月03日
    浏览(42)
  • WPF【二】基于MVVM模式,通过点击按钮(RadioButton)实现主页面显示不同的UserControl

    效果图 一、UI界面的按钮绑定对应的命令【Command】以及命令参数【CommandParameter】 二、 UI【代码】通过内容去绑定需要显示的UserControl页 三、 编写对应的ViewModel.cs文件实现对应的功能,注意:代码中SecondWindow以及FirstPageView两个类是需要用户鼠标右键点击添加【新建项目】选

    2024年02月05日
    浏览(48)
  • WPF MVVM之INotifyPropertyChanged接口的几种实现方式

    序言        借助WPF/Sliverlight强大的数据绑定功能,可以比实现比MFC,WinForm更加优雅轻松的数据绑定。但是在使用WPF/Silverlight绑定时,有件事情是很苦恼的:当ViewModel对象放生改变,需要通知UI。我们可以让VM对象实现INotifyPropertyChanged接口,通过事件来通知UI。但问题就出现

    2024年02月16日
    浏览(39)
  • WPF 使用MVVM框架创建一个项目

    步骤如下: 1、打开Visual Studio 2017(或其他版本),选择新建项目 2、选择WPF应用(.Net Framework),同时给项目命名,并选择项目存放路径,最后点击确定 3、右键点击解决方案名称,点击“管理NuGet程序包”,点击浏览,在输入框中输入mvvmlight,点击MvvmLight进行安装,安装过程

    2024年02月05日
    浏览(65)
  • WPF 项目中 MVVM模式 的简单例子说明

    MVVM 是 Model view viewModel 的简写。MVVM模式有助于将应用程序的业务和表示逻辑与用户界面清晰分离。 几个概念的说明: model :数据,界面中需要的数据,最好不要加逻辑代码 view : 视图就是用户看到的UI结构 xaml 文件 viewModel : 业务逻辑代码 绑定器:声明性数据和命令绑定隐含在

    2024年02月11日
    浏览(31)
  • 工控视觉项目桌面端WPF源码,UI源码,已实现前后端MVVM数据绑定

    工控视觉项目桌面端WPF源码,UI源码,已实现前后端MVVM数据绑定。 除了两个柱状图用的第三方开源控件,其他都是原生自己写的,非常适合初学者熟悉语法、事件、触发器、MVVM 机制、布局容器,方便二次开发和修改 工控视觉项目桌面端WPF源码,UI源码,已实现前后端MVVM数据

    2024年02月20日
    浏览(44)
  • wpf中prism框架

    安装prism包: 添加引用   修改完上述,重新生成项目 安装Prism项目模板  安装过程中关闭Visual Studio,安装完毕再打开,即可创建prism框架的项目。

    2024年02月07日
    浏览(41)
  • Nlog&Prism&WPF

    介绍了为WPF框架Prism注册Nlog日志服务的方法 无论是在WPF或者ASP.NET Core当中, 都可以使用ServiceCollection来做到着一点, 因为日志框架都提供了IServiceCollection的扩展。 但是, 如果现在你使用的是Prism 8.0的应用程序, Prism提供了多种容器的支持, 例如:DryIoc或者Unity, 这个时候我们如果现

    2024年02月07日
    浏览(52)
  • 简介WPF的Prism框架

            Prism是一个用于在 WPF、Xamarin Form、Uno 平台和 WinUI 中构建松散耦合、可维护和可测试的 XAML 应用程序框架。         Prism是一个用于在WPF、Xamarin Forms、Uno Platform和WinUI中构建松耦合、可维护和可测试的XAML应用程序的框架。 每个平台都有独立的版本,它们将按照

    2024年02月05日
    浏览(45)
  • WPF Prism的简单使用

    新建 WPF 项目,我是基于 .net 5.0-windows 创建的。 引入 Prism.DryIoc(8.1.97) 的 Nuget 包。 App.xaml 中引入命名空间。 将 App.xaml 中 Application 标签更改成 prism:PrismApplication 并去除 StartUri 属性,将 App.xaml.cs 中 Application 更改成 PrismApplication 。 实现 PrismApplication (实际上是 PrismApplicationBas

    2023年04月14日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包