123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- using Avalonia;
- using Avalonia.Controls;
- using Avalonia.Markup.Xaml;
- using Avalonia.Threading;
- using fis.Mac;
- using fis.Managers;
- using fis.Utilities;
- using fis.Win;
- using fis.Win.Utilities;
- using System;
- using System.Collections.Generic;
- using System.Globalization;
- using System.IO;
- using System.Reflection;
- using System.Runtime.InteropServices;
- using System.Threading;
- using System.Threading.Tasks;
- using Xilium.CefGlue.Avalonia;
- namespace fis
- {
- public partial class SlaveWindow : BaseWindow
- {
-
- private AvaloniaCefBrowser _browser;
- private string _host = "";
- private Dictionary<string, string> _parameters = new Dictionary<string, string>();
- /// <summary>
- /// 副窗口是否强制关闭,false则是点击关闭时隐藏,true则是窗口直接关闭
- /// </summary>
- public bool ForceClose { get; set; } = false;
- public SlaveWindow()
- {
- IsMainWindow = false;
- AvaloniaXamlLoader.Load(this);
- InitializeComponent();
- _browser = BrowserManager.SlaveBrowser;
- Closing += SlaveWindow_Closing;
- }
- /// <summary>
- /// 初始化参数和组件
- /// </summary>
- /// <param name="host"></param>
- /// <param name="dictionary"></param>
- public void init(string host, Dictionary<string, string> dictionary)
- {
- _parameters = dictionary;
- _host = host;
- var parameter = "";
- var index = 0;
- foreach (var p in _parameters)
- {
- parameter += p.Key + "=" + p.Value;
- if (index < _parameters.Count - 1)
- {
- parameter += "&";
- }
- index++;
- }
- //Make cross domain work.
- if (parameter.Length > 0)
- {
- var url = "http://" + ShellConfig.Instance.AppHost + "/index.html?page=measure&" + parameter;
- _browser.Address = url;
- }
- else
- {
- _browser.Address = _host;
- }
- WindowStartupLocation = WindowStartupLocation.Manual;
- Position = new PixelPoint();
- WindowState = WindowState.Maximized;
- }
- /// <summary>
- /// 修改页面内容
- /// </summary>
- /// <param name="host"></param>
- /// <param name="keyValuePairs"></param>
- internal async Task ChangeContentViewAsync(string host, Dictionary<string, string> keyValuePairs, WindowType windowType)
- {
- TargetMethodName targetMethodName;
- _host = host;
- _parameters = keyValuePairs;
- var arguments = new List<string>();
- foreach (var p in _parameters)
- {
- arguments.Add(p.Value);
- }
- await Dispatcher.UIThread.InvokeAsync(() =>
- {
- if (WindowState == WindowState.Minimized)
- {
- WindowState = WindowState.Maximized;
- }
- if (!ShowInTaskbar)
- {
- ShowInTaskbar = true;
- ShowActivated = true;
- }
- Show();
- });
- ///窗口在hidden变成show的时候容易卡死,加个Sleep能缓解这种情况
- Thread.Sleep(600);
- if (windowType == WindowType.TemplateDesigner) {
- targetMethodName = TargetMethodName.OpenReportDesignerPage;
- }
- else if (windowType == WindowType.Measure)
- {
- targetMethodName = TargetMethodName.OpenMeasurePage;
- }
- else {
- if (arguments.Count == 3) {
- targetMethodName = TargetMethodName.OpenReportPreviewPage;
- }
- else
- {
- targetMethodName = TargetMethodName.OpenReportEditPage;
- }
- }
- BrowserManager.ExecuteJS(targetMethodName, arguments, false);
- }
- private void SlaveWindow_Closing(object? sender, System.ComponentModel.CancelEventArgs e)
- {
- ///若非强制关闭副窗口,则隐藏副窗口
- ///用于保持Flutter在内存中不被销毁
- if (!ForceClose)
- {
- e.Cancel = true;
- Dispatcher.UIThread.InvokeAsync(() =>
- {
- ShowActivated = false;
- Hide();
- });
- GC.Collect();
- }
- }
- }
- }
|