diff --git a/src/MeoAsstGui/Bootstrapper.cs b/src/MeoAsstGui/Bootstrapper.cs index aeab2b5385..90dbe52adc 100644 --- a/src/MeoAsstGui/Bootstrapper.cs +++ b/src/MeoAsstGui/Bootstrapper.cs @@ -9,6 +9,7 @@ // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY +using System.Reflection; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Threading; @@ -21,20 +22,22 @@ namespace MeoAsstGui public class Bootstrapper : Bootstrapper { private static TrayIcon _trayIconInSettingsViewModel; - private static bool _isTrayIconInSettingsViewModelSet = false; - public static void SetTrayIconInSettingsViewModel(TrayIcon trayIcon) + + private static readonly FieldInfo _settingsViewModelIContainerFiled = + typeof(SettingsViewModel).GetField("_container", BindingFlags.NonPublic | BindingFlags.Instance); + /// + /// 应当只能是SettingsViewModel在构造时调用这个函数。用反射拿_container只是为了不额外修改SettingsViewModel的定义, + /// 并顺便检查传入的SettingsViewModel中的_container不为空(即不是随便new出来的一个SettingsViewModel) + /// + /// SettingsViewModel的this + internal static void SetTrayIconInSettingsViewModel(SettingsViewModel settingsViewModel) { - if (!_isTrayIconInSettingsViewModelSet) + var container = (IContainer)_settingsViewModelIContainerFiled.GetValue(settingsViewModel); + if (container != null) { - _trayIconInSettingsViewModel = trayIcon; - _isTrayIconInSettingsViewModelSet = true; - } - else - { - // 什么,SettingsViewModel会重复初始化。我相信后人的智慧。 - throw new System.InvalidOperationException( - "不可重复对源自SettingsViewModel的trayIcon引用赋值,它会在SettingsViewModel初始化时被初始化。"); + _trayIconInSettingsViewModel = container.Get(); } + //TODO:出现不符合要求的settingsViewModel应当Log一下,等一个有缘人 } // 初始化些啥自己加 diff --git a/src/MeoAsstGui/Helper/TrayIcon.cs b/src/MeoAsstGui/Helper/TrayIcon.cs index 0b6afed1ad..89766bb806 100644 --- a/src/MeoAsstGui/Helper/TrayIcon.cs +++ b/src/MeoAsstGui/Helper/TrayIcon.cs @@ -22,6 +22,7 @@ namespace MeoAsstGui public partial class TrayIcon { private NotifyIcon notifyIcon = new NotifyIcon(); + private TaskQueueViewModel taskQueueViewModel; private WindowState ws; //记录窗体状态 private bool _isMinimizeToTaskbar = false; @@ -41,15 +42,23 @@ namespace MeoAsstGui MenuItem showMenu = new System.Windows.Forms.MenuItem("打开 MAA"); showMenu.Click += App_show; // 不知道怎么调用 TaskQueue.LinkStart, 等一个有缘的大佬来写( - //MenuItem startMenu = new System.Windows.Forms.MenuItem("开始长草"); - //startMenu.Click += StartTask; - //MenuItem stopMenu = new System.Windows.Forms.MenuItem("全部停止"); - //stopMenu.Click += StopTask; + MenuItem startMenu = new System.Windows.Forms.MenuItem("开始长草"); + startMenu.Click += StartTask; + MenuItem stopMenu = new System.Windows.Forms.MenuItem("全部停止"); + stopMenu.Click += StopTask; MenuItem exitMenu = new System.Windows.Forms.MenuItem("退出"); exitMenu.Click += App_exit; - System.Windows.Forms.MenuItem[] menuItems = new MenuItem[] { showMenu, exitMenu }; + System.Windows.Forms.MenuItem[] menuItems = new MenuItem[] { showMenu, startMenu, stopMenu, exitMenu }; this.notifyIcon.ContextMenu = new System.Windows.Forms.ContextMenu(menuItems); } + /// + /// 只应该在TaskQueueViewModel的构造函数中调用这个函数,不要传入一个随便new出来的TaskQueueViewModel + /// + /// 一个 不是 随便new出来的TaskQueueViewModel + public void SetTaskQueueViewModel(TaskQueueViewModel taskQueueViewModel) + { + this.taskQueueViewModel = taskQueueViewModel; + } private void MainWindow_StateChanged(object sender, EventArgs e) { @@ -83,15 +92,16 @@ namespace MeoAsstGui } } - //private void StartTask(object sender, EventArgs e) - //{ - // 不知道怎么调用 TaskQueue.LinkStart, 等一个有缘的大佬来写( - //} + private void StartTask(object sender, EventArgs e) + { + //taskQueueViewModel意外为null了是不是也可以考虑Log一下 + taskQueueViewModel?.LinkStart(); + } - //private void StopTask(object sender, EventArgs e) - //{ - // 不知道怎么调用 TaskQueue.Stop, 等一个有缘的大佬来写( - //} + private void StopTask(object sender, EventArgs e) + { + taskQueueViewModel?.Stop(); + } private void App_exit(object sender, EventArgs e) { diff --git a/src/MeoAsstGui/ViewModels/SettingsViewModel.cs b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs index a9b0cbc83a..fe9a2fc63f 100644 --- a/src/MeoAsstGui/ViewModels/SettingsViewModel.cs +++ b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs @@ -63,7 +63,7 @@ namespace MeoAsstGui var trayObj = _container.Get(); trayObj.SetVisible(UseTray); trayObj.SetMinimizeToTaskbar(MinimizeToTray); - Bootstrapper.SetTrayIconInSettingsViewModel(trayObj); + Bootstrapper.SetTrayIconInSettingsViewModel(this); } private List _listTitle = new List(); diff --git a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs index 7d81957400..18f6f1ee3a 100644 --- a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs +++ b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs @@ -66,6 +66,8 @@ namespace MeoAsstGui LogItemViewModels = new ObservableCollection(); InitializeItems(); InitTimer(); + var trayIcon = _container.Get(); + trayIcon.SetTaskQueueViewModel(this); } //public void ShowButton()