浏览代码

修复多次点击测量页面会出现多个窗口

loki.wu 2 年之前
父节点
当前提交
b9a3ae3984

+ 0 - 39
fis/Helpers/SecondaryScreenHelper.cs

@@ -1,39 +0,0 @@
-using Avalonia;
-using Avalonia.Threading;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-
-namespace fis.Win.Dev.Helpers
-{
-    internal class SecondaryScreenHelper
-    {
-
-        /// <summary>
-        /// 打开测量页
-        /// </summary>
-        /// <returns></returns>
-        public static async Task<bool> OpenSecondaryWindowAsync(string host,Dictionary<string, string> keyValuePairs)
-       {
-            
-            await Dispatcher.UIThread.InvokeAsync(() =>
-            {
-                SlaveWindow window = new SlaveWindow();
-                window.init(host, keyValuePairs);
-                if (window.Screens.ScreenCount > 1)
-                {
-                    var screen = window.Screens.All.FirstOrDefault(x => x.Primary == false);
-                    if (screen != null)
-                    {
-                        window.Position = new PixelPoint(screen.Bounds.X, screen.Bounds.Y);
-                    }
-                }
-                window.Show();
-            });
-              
-            return true;
-       }
-
-
-    }
-}

+ 1 - 0
fis/Managers/AppManager.cs

@@ -85,6 +85,7 @@ namespace fis.Managers
             RegisterManager<IVidManager>(new VidManager());
             RegisterManager<IFileExporterManager>(new FileExporterManager());
             RegisterManager<IFileStorageManager>(new FileStorageManager());
+            RegisterManager<ISecondaryScreenManager>(new SecondaryScreenManager());
 
             _initialized = true;
         }

+ 22 - 0
fis/Managers/Interfaces/ISecondaryScreenManager.cs

@@ -0,0 +1,22 @@
+using fis.Managers.Interfaces;
+using fis.Win.Dev.Utilities;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace fis.Win.Dev.Managers.Interfaces
+{
+    internal interface ISecondaryScreenManager : IFisManager
+    {
+        /// <summary>
+        /// 弹出新窗口
+        /// </summary>
+        /// <param name="windowType"></param>
+        /// <param name="host"></param>
+        /// <param name="keyValuePairs"></param>
+        /// <returns></returns>
+        Task ShowWindowByTypeAsync(WindowType windowType, string host, Dictionary<string, string> keyValuePairs);
+    }
+}

+ 59 - 0
fis/Managers/SecondaryScreenManager.cs

@@ -0,0 +1,59 @@
+using Avalonia;
+using Avalonia.Threading;
+using fis.Win.Dev.Managers.Interfaces;
+using fis.Win.Dev.Utilities;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace fis.Win.Dev.Managers
+{
+    internal class SecondaryScreenManager: ISecondaryScreenManager
+    {
+        Dictionary<WindowType, SlaveWindow> windows = new Dictionary<WindowType, SlaveWindow>();
+
+        public async Task ShowWindowByTypeAsync(WindowType windowType, string host, Dictionary<string, string> keyValuePairs) 
+        {
+            await Dispatcher.UIThread.InvokeAsync(() =>
+            {
+                SlaveWindow window;
+                if (windows.Keys.Contains(windowType))
+                {
+                    window = windows[windowType];
+                    window.ChangeContent(host, keyValuePairs);
+                }
+                else
+                {
+                    window = new SlaveWindow();
+                    window.init(host, keyValuePairs);
+                    if (window.Screens.ScreenCount > 1)
+                    {
+                        var screen = window.Screens.All.FirstOrDefault(x => x.Primary == false);
+                        if (screen != null)
+                        {
+                            window.Position = new PixelPoint(screen.Bounds.X, screen.Bounds.Y);
+                        }
+                    }
+                    window.Closed += Window_Closed;
+                    windows.Add(windowType, window);
+                    window.Show();
+                }
+               
+            });
+        }
+
+        private void Window_Closed(object? sender, EventArgs e)
+        {
+            if (windows.Any(w => w.Value == sender)) {
+                var window = windows.FirstOrDefault(x=>x.Value == sender);
+                windows.Remove(window.Key);
+            }
+        }
+
+        public void Dispose()
+        {
+            
+        }
+    }
+}

+ 8 - 3
fis/PlatformService.cs

@@ -3,6 +3,7 @@ using fis.Managers.Interfaces;
 using fis.Models.Vid;
 using fis.Win.Dev.Helpers;
 using fis.Win.Dev.Managers.Interfaces;
+using fis.Win.Dev.Utilities;
 using System;
 using System.Collections.Generic;
 
@@ -42,17 +43,21 @@ namespace fis
             dictionary.Add("patientCode", patientCode);
             dictionary.Add("index", index);
             dictionary.Add("imageIndex", imageIndex);
-            return  SecondaryScreenHelper.OpenSecondaryWindowAsync("http://" + ShellConfig.Instance.AppHost + "/#/measure/measure_home",dictionary).Result;
+            var manager = AppManager.Get<ISecondaryScreenManager>();
+            manager.ShowWindowByTypeAsync(WindowType.Measure,"http://" + ShellConfig.Instance.AppHost + "/#/measure/measure_home", dictionary);
+            return  true;
         }
 
         /// <summary>
         /// 打开报告设计器
         /// </summary>
         /// <returns></returns>
-        public bool OpenReportDesigner() 
+        public bool OpenReportDesigner()
         {
+            var manager = AppManager.Get<ISecondaryScreenManager>();
             var dictionary = new Dictionary<string, string>();
-            return SecondaryScreenHelper.OpenSecondaryWindowAsync("http://" + ShellConfig.Instance.DistHost + "/index.html", dictionary).Result;
+            manager.ShowWindowByTypeAsync(WindowType.TemplateDesigner,"http://" + ShellConfig.Instance.DistHost + "/index.html", dictionary);
+            return true;
         }
 
         public LoadVidResult LoadVid(string url)

+ 30 - 1
fis/SlaveWindow.axaml.cs

@@ -34,6 +34,35 @@ namespace fis
 #endif
         }
 
+        /// <summary>
+        /// 修改页面内容
+        /// </summary>
+        /// <param name="host"></param>
+        /// <param name="keyValuePairs"></param>
+        internal void ChangeContent(string host, Dictionary<string, string> keyValuePairs)
+        {
+            var browserContainer = this.FindControl<Border>("BrowserBorder");
+
+            var parameter = "";
+            var index = 0;
+            foreach (var p in _parameters)
+            {
+                parameter += p.Key + "=" + p.Value;
+                if (index < _parameters.Count - 1)
+                {
+                    parameter += "&";
+                }
+                index++;
+            }
+            _browser.Address = "http://" + ShellConfig.Instance.AppHost + "/index.html?page=measure&" + parameter; 
+            browserContainer.Child = _browser;
+        }
+
+        /// <summary>
+        /// 初始化参数和组件
+        /// </summary>
+        /// <param name="host"></param>
+        /// <param name="dictionary"></param>
         public void init(string host, Dictionary<string, string> dictionary) 
         {
             _parameters = dictionary;
@@ -66,7 +95,7 @@ namespace fis
             }
             if (_host.Contains(ShellConfig.Instance.DistHost))
             {
-                var appHandler = new FileSystemHostHandler(ShellConfig.Instance.DistHost, ShellConfig.Instance.DistResourcePath);
+                var appHandler = new FileSystemHostHandler(ShellConfig.Instance.DistHost + "/index.html", ShellConfig.Instance.DistResourcePath);
                 var handler = new HostRequestHandler();
                 handler.RegisterHostHandler(appHandler);
                 _browser = new AvaloniaCefBrowser

+ 13 - 0
fis/Utilities/WindowType.cs

@@ -0,0 +1,13 @@
+namespace fis.Win.Dev.Utilities
+{
+    /// <summary>
+    /// 窗口类别
+    /// </summary>
+    public enum WindowType
+    {
+        Measure,//测量
+        ReportEdit,//报告编辑
+        ReportView,//报告预览
+        TemplateDesigner,//模板设计器
+    }
+}