Merge pull request #1194 from BombaxCeiba/TrayIconImpl

任务栏图标支持 开始长草 和 全部停止
This commit is contained in:
ABA2396
2022-07-16 21:23:18 +08:00
committed by GitHub
4 changed files with 40 additions and 25 deletions

View File

@@ -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<RootViewModel>
{
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);
/// <summary>
/// 应当只能是SettingsViewModel在构造时调用这个函数。用反射拿_container只是为了不额外修改SettingsViewModel的定义
/// 并顺便检查传入的SettingsViewModel中的_container不为空即不是随便new出来的一个SettingsViewModel
/// </summary>
/// <param name="settingsViewModel">SettingsViewModel的this</param>
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<TrayIcon>();
}
//TODO:出现不符合要求的settingsViewModel应当Log一下等一个有缘人
}
// 初始化些啥自己加

View File

@@ -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);
}
/// <summary>
/// 只应该在TaskQueueViewModel的构造函数中调用这个函数不要传入一个随便new出来的TaskQueueViewModel
/// </summary>
/// <param name="taskQueueViewModel">一个 不是 随便new出来的TaskQueueViewModel</param>
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)
{

View File

@@ -63,7 +63,7 @@ namespace MeoAsstGui
var trayObj = _container.Get<TrayIcon>();
trayObj.SetVisible(UseTray);
trayObj.SetMinimizeToTaskbar(MinimizeToTray);
Bootstrapper.SetTrayIconInSettingsViewModel(trayObj);
Bootstrapper.SetTrayIconInSettingsViewModel(this);
}
private List<string> _listTitle = new List<string>();

View File

@@ -66,6 +66,8 @@ namespace MeoAsstGui
LogItemViewModels = new ObservableCollection<LogItemViewModel>();
InitializeItems();
InitTimer();
var trayIcon = _container.Get<TrayIcon>();
trayIcon.SetTaskQueueViewModel(this);
}
//public void ShowButton()