提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
目的是想在Prism MVVM中通过注入的方式来全局访问主窗体(MainWindow)。
一、项目结构图
项目创建
创建一个Prism Full App(WPF)项目,在Services项目文件夹中创建一个Public_Global项目并创建一个Global.cs类用来注入。文章来源:https://www.toymoban.com/news/detail-448597.html
流程步骤
- Dongming_BigTest.App.xmal.cs中注入Public_Global.Global类
- Dongming_BigTest.App.xmal.cs中给protected override Window CreateShell()将实例化后的主窗体赋值给Global.MainWindow
- 在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模板网!