提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
前言
目的是想在Prism MVVM中通過注入的方式來全局訪問主窗體(MainWindow)。
一、項目結(jié)構(gòu)圖
項目創(chuàng)建
創(chuàng)建一個Prism Full App(WPF)項目,在Services項目文件夾中創(chuàng)建一個Public_Global項目并創(chuàng)建一個Global.cs類用來注入。文章來源:http://www.zghlxwxcb.cn/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>
/// 設(shè)置窗口
/// </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>
/// 構(gòu)造函數(shù)
/// </summary>
public Global()
{
MainWindow = SetMainWindow;
}
/// <summary>
/// 當(dāng)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();//創(chuàng)建對像
_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>
/// 構(gòu)造函數(shù)
/// </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中的不是同一個,
//但是在構(gòu)建時用靜態(tài)的SetMainWindow給MainWindow重新賦值了
//所以在這里可以獲到window的實例
Window window = global.MainWindow as Window;
window.Opacity = 0.3;//窗口透明度設(shè)置為0.3
Message = messageService.GetMessage();
}
public override void OnNavigatedTo(NavigationContext navigationContext)
{
}
}
}
總結(jié)
通過本文的方法可以在程序的所有頁面都可以調(diào)用主窗體的內(nèi)容。希望能對大家有綁助,如果誰有更好的方法可以給我留言相互學(xué)習(xí),謝謝了。
源碼下載文章來源地址http://www.zghlxwxcb.cn/news/detail-448597.html
到了這里,關(guān)于WPF Prism MVVM技巧【用注入方式在不同項目中訪問主窗體(MainWindow)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!