MainWindowViewModel.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. using HandyControl.Interactivity.Commands;
  2. using Shaker.Model;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Collections.ObjectModel;
  6. using System.Diagnostics.CodeAnalysis;
  7. using System.Linq;
  8. using System.Reflection;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows;
  12. using System.Windows.Input;
  13. namespace ShakerManger.ViewModel
  14. {
  15. internal class MainWindowViewModel:Shaker.ViewModel.ViewModelBase<Shaker.Model.ModelBase>
  16. {
  17. public bool IsEnabled { get => isEnabled; set =>UpdateProperty(ref isEnabled, value); }
  18. [AllowNull]
  19. private IMainPageViewModel currentMainPage;
  20. private bool isEnabled = true;
  21. private bool isSaveData = false;
  22. private bool layoutVisibily = true;
  23. private MainWindowViewModel()
  24. {
  25. this.GetType().Assembly.GetTypes().Where(x => x.GetInterface(typeof(IMainPageViewModel).FullName!)!= null && x.IsAnsiClass && !x.IsAbstract)
  26. .Select(x => (IMainPageViewModel)Activator.CreateInstance(x)!)
  27. .Where(x => x != null)
  28. .OrderBy(x => x!.MainPageType)
  29. .ToList()
  30. .ForEach(x => MainPages.Add(x!));
  31. Shakers = MainPages.OfType<ShakersViewModel>().First();
  32. LogManger = MainPages.OfType<LogMangerViewModel>().First();
  33. SystemConfig = MainPages.OfType<SystemConfigViewModel>().First();
  34. DataManger = MainPages.OfType<DataMangerViewModel>().First();
  35. WarnManger = MainPages.OfType<WarnMangerViewModel>().First();
  36. if(MainPages.Count > 0)
  37. {
  38. CurrentMainPage = MainPages[0];
  39. }
  40. LayoutManger.Close = () =>
  41. {
  42. Shakers.Layout = LayoutManger.Selected;
  43. };
  44. }
  45. public DataMangerViewModel DataManger { get; init; }
  46. public LogMangerViewModel LogManger { get; init; }
  47. static MainWindowViewModel()
  48. {
  49. }
  50. public ICommand StartAllCommand => new DelegateCommand(StartAll);
  51. private void StartAll()
  52. {
  53. BusManger.Defaut.Bus.PubSub.PublishAsync(new SysControl()
  54. {
  55. Cmd = SysCmd.Start,
  56. });
  57. }
  58. public ICommand StopAllCommand => new DelegateCommand(StopAll);
  59. private void StopAll()
  60. {
  61. BusManger.Defaut.Bus.PubSub.PublishAsync(new SysControl()
  62. {
  63. Cmd = SysCmd.Stop,
  64. });
  65. }
  66. public SystemConfigViewModel SystemConfig { get; init; }
  67. public override void Init()
  68. {
  69. base.Init();
  70. var result = Sql.Default.Connect();
  71. if(!result)
  72. {
  73. Tools.MessageBoxHelper.Error("数据库连接失败,程序退出");
  74. App.Current.Shutdown();
  75. return;
  76. }
  77. BusManger.Defaut.Init();
  78. if(Thread.CurrentThread == Application.Current.Dispatcher.Thread)
  79. {
  80. Shakers.Init();
  81. SystemConfig.Init();
  82. }
  83. else
  84. {
  85. App.Current.Dispatcher.Invoke(() =>
  86. {
  87. Shakers.Init();
  88. SystemConfig.Init();
  89. });
  90. }
  91. BusManger.Defaut.Bus.PubSub.PublishAsync(new Shaker.Model.MangerExitModel()
  92. {
  93. Online = true,
  94. });
  95. BusManger.Defaut.Bus.PubSub.Subscribe<Shaker.Model.WarnModel>((data, _) =>
  96. {
  97. Sql.Default.Insert(data);
  98. });
  99. if (Thread.CurrentThread == Application.Current.Dispatcher.Thread)
  100. {
  101. InitedAction?.Invoke();
  102. }
  103. else
  104. {
  105. App.Current.Dispatcher.Invoke(() =>
  106. {
  107. InitedAction?.Invoke();
  108. });
  109. }
  110. }
  111. public WarnMangerViewModel WarnManger { get; }
  112. public ShakersViewModel Shakers { get; }
  113. public LayoutMangerViewModel LayoutManger { get; }= new LayoutMangerViewModel();
  114. public ICommand ExitCommand => new DelegateCommand(Exit);
  115. private void Exit()
  116. {
  117. PromptViewModel.Default.Init();
  118. PromptViewModel.Default.Message = "是否退出程序?";
  119. PromptViewModel.Default.YesAction = () => App.Current.Shutdown();
  120. PromptViewModel.Default.IsOpen = true;
  121. }
  122. public bool LayoutVisibily { get => layoutVisibily; set =>UpdateProperty(ref layoutVisibily , value); }
  123. public ICommand SaveDataCommand => new DelegateCommand(() => IsSaveData = !IsSaveData);
  124. public bool IsSaveData { get => isSaveData; set =>UpdateProperty(ref isSaveData, value); }
  125. [AllowNull]
  126. public Action InitedAction { get; set; }
  127. public IMainPageViewModel CurrentMainPage { get => currentMainPage; set =>UpdateProperty(ref currentMainPage, value); }
  128. public ObservableCollection<IMainPageViewModel> MainPages { get; } = new ObservableCollection<IMainPageViewModel>();
  129. public static MainWindowViewModel Default { get; } = new MainWindowViewModel();
  130. public ICommand CloseCommand=> new DelegateCommand(Close);
  131. private void Close()
  132. {
  133. if(BusManger.Defaut.Bus!=null)
  134. {
  135. BusManger.Defaut.Bus.PubSub.PublishAsync(new Shaker.Model.MangerExitModel()
  136. {
  137. Online = false,
  138. });
  139. BusManger.Defaut.Bus.Dispose();
  140. }
  141. LogManger.AddLog("程序退出");
  142. }
  143. public ICommand ShutDownCommand=> new DelegateCommand(()=> App.Current.Shutdown());
  144. }
  145. }