SlaveWindow.axaml.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using Avalonia;
  2. using Avalonia.Controls;
  3. using Avalonia.Markup.Xaml;
  4. using Avalonia.Threading;
  5. using fis.Mac;
  6. using fis.Managers;
  7. using fis.Utilities;
  8. using fis.Win;
  9. using fis.Win.Utilities;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Globalization;
  13. using System.IO;
  14. using System.Reflection;
  15. using System.Runtime.InteropServices;
  16. using System.Threading;
  17. using System.Threading.Tasks;
  18. using Xilium.CefGlue.Avalonia;
  19. namespace fis
  20. {
  21. public partial class SlaveWindow : BaseWindow
  22. {
  23. private AvaloniaCefBrowser _browser;
  24. private string _host = "";
  25. private Dictionary<string, string> _parameters = new Dictionary<string, string>();
  26. /// <summary>
  27. /// 副窗口是否强制关闭,false则是点击关闭时隐藏,true则是窗口直接关闭
  28. /// </summary>
  29. public bool ForceClose { get; set; } = false;
  30. public SlaveWindow()
  31. {
  32. IsMainWindow = false;
  33. AvaloniaXamlLoader.Load(this);
  34. InitializeComponent();
  35. _browser = BrowserManager.SlaveBrowser;
  36. Closing += SlaveWindow_Closing;
  37. }
  38. /// <summary>
  39. /// 初始化参数和组件
  40. /// </summary>
  41. /// <param name="host"></param>
  42. /// <param name="dictionary"></param>
  43. public void init(string host, Dictionary<string, string> dictionary)
  44. {
  45. _parameters = dictionary;
  46. _host = host;
  47. var parameter = "";
  48. var index = 0;
  49. foreach (var p in _parameters)
  50. {
  51. parameter += p.Key + "=" + p.Value;
  52. if (index < _parameters.Count - 1)
  53. {
  54. parameter += "&";
  55. }
  56. index++;
  57. }
  58. //Make cross domain work.
  59. if (parameter.Length > 0)
  60. {
  61. var url = "http://" + ShellConfig.Instance.AppHost + "/index.html?page=measure&" + parameter;
  62. _browser.Address = url;
  63. }
  64. else
  65. {
  66. _browser.Address = _host;
  67. }
  68. WindowStartupLocation = WindowStartupLocation.Manual;
  69. Position = new PixelPoint();
  70. WindowState = WindowState.Maximized;
  71. }
  72. /// <summary>
  73. /// 修改页面内容
  74. /// </summary>
  75. /// <param name="host"></param>
  76. /// <param name="keyValuePairs"></param>
  77. internal async Task ChangeContentViewAsync(string host, Dictionary<string, string> keyValuePairs, WindowType windowType)
  78. {
  79. TargetMethodName targetMethodName;
  80. _host = host;
  81. _parameters = keyValuePairs;
  82. var arguments = new List<string>();
  83. foreach (var p in _parameters)
  84. {
  85. arguments.Add(p.Value);
  86. }
  87. await Dispatcher.UIThread.InvokeAsync(() =>
  88. {
  89. if (WindowState == WindowState.Minimized)
  90. {
  91. WindowState = WindowState.Maximized;
  92. }
  93. if (!ShowInTaskbar)
  94. {
  95. ShowInTaskbar = true;
  96. ShowActivated = true;
  97. }
  98. Show();
  99. });
  100. ///窗口在hidden变成show的时候容易卡死,加个Sleep能缓解这种情况
  101. Thread.Sleep(600);
  102. if (windowType == WindowType.TemplateDesigner) {
  103. targetMethodName = TargetMethodName.OpenReportDesignerPage;
  104. }
  105. else if (windowType == WindowType.Measure)
  106. {
  107. targetMethodName = TargetMethodName.OpenMeasurePage;
  108. }
  109. else {
  110. if (arguments.Count == 3) {
  111. targetMethodName = TargetMethodName.OpenReportPreviewPage;
  112. }
  113. else
  114. {
  115. targetMethodName = TargetMethodName.OpenReportEditPage;
  116. }
  117. }
  118. BrowserManager.ExecuteJS(targetMethodName, arguments, false);
  119. }
  120. private void SlaveWindow_Closing(object? sender, System.ComponentModel.CancelEventArgs e)
  121. {
  122. ///若非强制关闭副窗口,则隐藏副窗口
  123. ///用于保持Flutter在内存中不被销毁
  124. if (!ForceClose)
  125. {
  126. e.Cancel = true;
  127. Dispatcher.UIThread.InvokeAsync(() =>
  128. {
  129. ShowActivated = false;
  130. Hide();
  131. });
  132. GC.Collect();
  133. }
  134. }
  135. }
  136. }