MainWindowViewModel.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using Avalonia;
  2. using Avalonia.Controls;
  3. using Avalonia.Controls.ApplicationLifetimes;
  4. using CommunityToolkit.Mvvm.Input;
  5. using IModel;
  6. using IViewModel.ViewModels;
  7. using IViewModel.Views;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Reflection;
  13. using System.Runtime.CompilerServices;
  14. using System.Text;
  15. using System.Threading;
  16. using System.Threading.Tasks;
  17. using System.Windows.Input;
  18. namespace Dynamicloadsimulationdevice.ViewModels
  19. {
  20. internal sealed class MainWindowViewModel:IViewModel.ViewModels.DisplayViewModelBase
  21. {
  22. private Dictionary<RuntimeTypeHandle, BaseDialogWindow> opendWindows = new Dictionary<RuntimeTypeHandle, BaseDialogWindow>();
  23. private List<ViewModelBase> AllViewModels = new List<ViewModelBase>();
  24. private readonly string PluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory+"Plugins");
  25. private MainWindowViewModel()
  26. {
  27. IViewModel.ViewModels.LanguageViewModel.Instance.Init();
  28. MenuViewModel.Instance.MenuClick += (sender, args) =>
  29. {
  30. switch(args!.Header)
  31. {
  32. case nameof(LanguageValueViewModel.MenuExit):
  33. Exit();
  34. break;
  35. case nameof(LanguageValueViewModel.MenuAbout):
  36. break;
  37. default:
  38. {
  39. var v = AllViewModels.OfType<IDisplayViewModel>().FirstOrDefault(x => x.MenuKey == args.Header);
  40. if(v==null)
  41. {
  42. ShowToast(LanguageValueViewModel.Instance.NotSupport, Avalonia.Controls.Notifications.NotificationType.Error);
  43. return;
  44. }
  45. if(v.ShowTop)
  46. {
  47. if (App.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
  48. {
  49. IViewModel.Views.BaseDialogWindow window = new IViewModel.Views.BaseDialogWindow();
  50. window.DataContext = v;
  51. v.InitData();
  52. window.ShowDialog(desktop.MainWindow!);
  53. }
  54. }
  55. else
  56. {
  57. var handle = v.GetType().TypeHandle;
  58. if(opendWindows.TryGetValue(handle,out var window))
  59. {
  60. window.Activate();
  61. }
  62. else
  63. {
  64. window = new IViewModel.Views.BaseDialogWindow();
  65. window.DataContext = v;
  66. opendWindows[handle] = window;
  67. window.Closed += (_, _) =>
  68. {
  69. opendWindows.Remove(handle);
  70. };
  71. v.InitData();
  72. window.Show();
  73. }
  74. }
  75. }
  76. break;
  77. }
  78. };
  79. OilSourceControl =IModel.Tools.PluginsLoader.Defalut.Load<IOilSourceControl.IOilSourceControl>(PluginPath).FirstOrDefault();
  80. if(OilSourceControl!=null)
  81. {
  82. OilSourceControl.LocalCommunication = () => CommunicationViewModel.Instance.LocalCommunication;
  83. OilSourceControl.RemoteCommunication = () => CommunicationViewModel.Instance.ServiceCommunication;
  84. }
  85. AllViewModels.AddRange(System.Runtime.Loader.AssemblyLoadContext.Default.Assemblies.SelectMany(x => GetAssemblyViewModels(x)));
  86. AllViewModels.OfType<IDisplayViewModel>().Where(x => x.ShowMenu && !string.IsNullOrEmpty(x.MenuParentKey))
  87. .GroupBy(x => x.MenuParentKey)
  88. .ToList()
  89. .ForEach(x=>
  90. {
  91. var menuItem = MenuViewModel.Instance[x.Key];
  92. if(menuItem ==null)
  93. {
  94. menuItem = new MenuItemViewModel();
  95. menuItem.Header = x.Key;
  96. MenuViewModel.Instance.Menus.Add(menuItem);
  97. }
  98. x.Select(y=>
  99. {
  100. return(y.GetType().GetCustomAttribute<MenuOrderAttribute>()?.Order?? int.MinValue,y);
  101. })
  102. .OrderBy(x=>x.Item1)
  103. .ToList().ForEach(y =>
  104. {
  105. if(menuItem.Items.Count>0 && y.y.AppendSeparator)
  106. {
  107. menuItem.Items.Add(new MenuItemViewModel()
  108. {
  109. IsSeparator = true,
  110. });
  111. }
  112. menuItem.Items.Add(new MenuItemViewModel()
  113. {
  114. Header = y.y.MenuKey,
  115. IconKey = y.y.IconKey,
  116. });
  117. });
  118. });
  119. }
  120. static MainWindowViewModel()
  121. {
  122. }
  123. public override void Init()
  124. {
  125. }
  126. private bool debug = false;
  127. public bool Debug { get=>debug; set=> SetProperty(ref debug, value); }
  128. public IOilSourceControl.IOilSourceControl? OilSourceControl { get; private set; }
  129. public ICommand ClosingCommand =>new RelayCommand<WindowClosingEventArgs>(Closing);
  130. private void Closing(object? sender, WindowClosingEventArgs? args)
  131. {
  132. if (args != null)
  133. {
  134. args.Cancel = true;
  135. Exit();
  136. }
  137. }
  138. private void Exit()
  139. {
  140. ShowAsk(LanguageValueViewModel.Instance.PromptExitMsg,()=>
  141. {
  142. Environment.Exit(0);
  143. });
  144. }
  145. public static MainWindowViewModel Instance { get; } = new MainWindowViewModel();
  146. private List<ViewModelBase> GetAssemblyViewModels(Assembly assembly)
  147. {
  148. List<ViewModelBase> vm = new List<ViewModelBase>();
  149. if (assembly == null) return new List<ViewModelBase>();
  150. return assembly.GetTypes()
  151. .Where(x => x.IsAssignableTo(typeof(ViewModelBase)) && x.IsAnsiClass && !x.IsAbstract && x!= typeof(MainWindowViewModel))
  152. .Where(x =>
  153. {
  154. var pro = x.GetProperty("Instance", BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.Public);
  155. if (pro == null) return false;
  156. return pro.PropertyType == x;
  157. })
  158. .Select(x =>
  159. {
  160. var pro = x.GetProperty("Instance", BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.Public);
  161. var val = pro?.GetValue(null);
  162. if (val is ViewModelBase vm) return vm;
  163. return null;
  164. })
  165. .Where(x => x != null)
  166. .Select(x=>x!)
  167. .ToList();
  168. }
  169. }
  170. }