FieldWorkClient/App.xaml.cs

485 lines
17 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Windows;
using System.Windows.Media;
using HeBianGu.Base.WpfBase;
using HeBianGu.Control.Guide;
using HeBianGu.Control.ThemeSet;
using HeBianGu.General.WpfControlLib;
using HeBianGu.Service.Mvp;
using HeBianGu.Systems.Identity;
using HeBianGu.Systems.Setting;
using HeBianGu.Window.Link;
using Hopetry.Provider;
using Hopetry.Services;
using Hopetry.ViewModel.Sync;
using SqlSugar;
using SystemSetting = FileUploader.Models.SystemSetting;
namespace HeBianGu.App.Disk
{
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : ApplicationBase
{
private LinkWindowBase _mainWindow;
//protected override void OnStartup(StartupEventArgs e)
//{
// base.OnStartup(e);
// // 全局异常捕获
// DispatcherUnhandledException += (s, ex) =>
// LogError("UI Thread Error: " + ex.Exception.ToString());
// AppDomain.CurrentDomain.UnhandledException += (s, ex) =>
// LogError("AppDomain Error: " + ex.ExceptionObject.ToString());
// TaskScheduler.UnobservedTaskException += (s, ex) =>
// LogError("Task Error: " + ex.ExceptionObject.ToString());
//}
//private void LogError(string message)
//{
// File.WriteAllText("error.log", $"[{DateTime.Now}] {message}");
//}
public new static ComponentResourceKey Custom
{
get => new ComponentResourceKey(typeof(LinkWindowBase), (object)"S.Window.Link.Custom");
}
public static ComponentResourceKey WaitingPercent =>
new ComponentResourceKey(typeof(ProgressBarKeys), "S.ProgressBar.Custom");
protected override MainWindowBase CreateMainWindow(StartupEventArgs e)
{
_mainWindow = new ShellWindow() as LinkWindowBase;
return _mainWindow;
}
protected override void OnExit(ExitEventArgs e)
{
// 在应用程序退出时清理系统托盘图标
CleanupSystemTrayIcon();
base.OnExit(e);
}
private void CleanupSystemTrayIcon()
{
try
{
// 如果主窗口是LinkWindowBase类型尝试清理其系统托盘图标
if (_mainWindow != null)
{
// 通过反射访问LinkWindowBase中的NotifyIcon实例并清理
var notifyIconField = typeof(LinkWindowBase).GetField("_notifyIcon",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (notifyIconField != null)
{
var notifyIcon = notifyIconField.GetValue(_mainWindow);
if (notifyIcon != null)
{
var disposeMethod = notifyIcon.GetType().GetMethod("Dispose",
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
disposeMethod?.Invoke(notifyIcon, null);
}
}
// 同时尝试通过公共方法隐藏窗口
_mainWindow.Hide();
// 确保所有资源得到释放
System.Windows.Forms.Application.Exit();
}
}
catch (System.Exception ex)
{
System.Diagnostics.Debug.WriteLine($"清理系统托盘图标时出错: {ex.Message}");
}
// 确保应用程序完全退出
Application.Current.Shutdown();
}
protected override void ConfigureServices(IServiceCollection services)
{
base.ConfigureServices(services);
// 本地持久化
services.AddXmlSerialize();
// 设置
services.AddSetting();
// 另外保存设置目录
//services.AddSettingPath();
// minio 服务
services.AddSingleton<MinioService, MinioService>();
services.AddWindowDialog();
services.AddObjectWindowDialog();
services.AddWindowAnimation();
services.AddMessageProxy();
services.AddPropertyGridMessage();
services.AddAutoColumnPagedDataGridMessage();
//services.AddNotifyMessage();
// 认证
// services.AddIdentity(x => x.ProductFontSize = 50);
services.AddMvc();
//services.AddProjectDefault();
services.AddXmlWebSerializerService();
//// Do :注册软件更新页面
/* services.AddAutoUpgrade(x =>
{
x.Uri = "https://gitee.com/hebiangu/wpf-auto-update/raw/master/Install/Computer/AutoUpdate.xml";
x.UseIEDownload = true;
});*/
services.AddDESCryptService();
services.AddPrintBoxMessage();
// ???
services.AddWindowExplorer();
#region - More -
//services.AddUpgradeViewPresenter();
//services.AddLicense();
//services.AddLicenseViewPresenter();
//services.AddVip();
//services.AddVipViewPresenter();
//services.AddSurveyViewPresenter();
//services.AddFeedbackViewPresenter();
services.AddLogoutViewPresenter();
//services.AddAboutViewPresenter();
services.AddMoreViewPresenter(x =>
{
//x.AddPersenter(UpgradeViewPresenter.Instance);
//x.AddPersenter(LicenseViewPresenter.Instance);
//x.AddPersenter(VipViewPresenter.Instance);
//x.AddPersenter(SurveyViewPresenter.Instance);
//x.AddPersenter(FeedbackViewPresenter.Instance);
//x.AddPersenter(AboutViewPresenter.Instance);
x.AddPersenter(LogoutViewPresenter.Instance);
});
#endregion
#region - WindowCaption -
//以下各种功能按钮
//services.AddLoginViewPresenter();
// 引导功能按钮
services.AddGuideViewPresenter();
services.AddHideWindowViewPresenter();
services.AddSettingViewPrenter();
//services.AddThemeRightToolViewPresenter();
//services.AddThemeRightViewPresenter();
services.AddWindowCaptionViewPresenter(x =>
{
x.AddPersenter(LoginViewPresenter.Instance);
x.AddPersenter(MoreViewPresenter.Instance);
x.AddPersenter(GuideViewPresenter.Instance);
x.AddPersenter(HideWindowViewPresenter.Instance);
x.AddPersenter(SettingViewPresenter.Instance);
//x.AddPersenter(ThemeRightToolViewPresenter.Instance);
});
#endregion
//string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Module", "HeBianGu.Domain.FATFS.dll");
//var dll = Assembly.LoadFile(path);
//var find = dll.GetTypes().Where(x => typeof(IExplorerService).IsAssignableFrom(x))?.FirstOrDefault();
//ServiceRegistry.Instance.Register(typeof(IExplorerService), find);
//services.AddSingleton<IExplorerService, WindowExplorerServiceDemo>();
//minio分片上传修改
PartSizeOverride.OverrideMinioCalculator();
var minioService = services.GetService<MinioService>();
var bucketName = minioService._bucketName;
var xmlSerializerService = services.GetService<ISerializerService>();
if (!File.Exists("./settings.xml"))
{
var tempSetting = new SystemSetting();
tempSetting.TaskCount = 3;
tempSetting.SyncDir = Path.Combine(SelectDrive(), "HopetryBoxData");
if (!Directory.Exists(tempSetting.SyncDir))
{
Directory.CreateDirectory(tempSetting.SyncDir);
}
xmlSerializerService.Save("./settings.xml", tempSetting);
}
var setting = xmlSerializerService.Load<SystemSetting>("./settings.xml");
if (string.IsNullOrEmpty(setting.SyncDir))
{
var selectDrive = SelectDrive();
setting.SyncDir = Path.Combine(selectDrive, "HopetryBoxData");
if (!Directory.Exists(setting.SyncDir))
{
Directory.CreateDirectory(setting.SyncDir);
}
// 保存配置
xmlSerializerService.Save("./settings.xml", setting);
}
if (setting.TaskCount == 0)
{
setting.TaskCount = 3;
}
// 创建统一的取消令牌源
var cancelToken = new CancellationTokenSource();
var temp = SyncSetting.Instance;
var notRun = true;
// 注册设置变更监听
temp.PropertyChanged += (s, e) =>
{
// 取下载目录
var setting1 = xmlSerializerService.Load<SystemSetting>("./settings.xml");
if (!string.IsNullOrEmpty(setting.SyncDir))
{
xmlSerializerService.Save("./settings.xml", setting);
setting.SyncDir = setting1.SyncDir;
}
if (temp.IsOn && notRun)
{
// 异步启动服务
Console.WriteLine("启动同步:");
try
{
var syncModel = services.GetService<SyncViewModel>();
Task.Run(async () =>
{
await minioService.MirrorAsync(bucketName, setting.SyncDir, (total, count, fileName) =>
{
//添加同步信息
syncModel.SyncProgressText = $"同步中: {count}/{total} {fileName}";
},
setting.TaskCount);
syncModel.SyncProgressText = "同步完成";
});
Task.Run(async () =>
{
await minioService.RealTimeListen(bucketName, setting.SyncDir, ( fileName) =>
{
//添加同步信息
syncModel.SyncProgressText = $"{fileName}";
},
cancellationToken: cancelToken.Token);
//syncModel.SyncProgressText = $"实时同步完成";
});
notRun = false;
}
catch (OperationCanceledException)
{
Console.WriteLine("同步监听已取消");
}
catch (Exception ex)
{
Console.WriteLine($"同步失败: {ex.Message}");
}
}
// 运行中 且 temp.IsOn 变成 false
else if (!notRun && !temp.IsOn)
{
notRun = true;
// 当设置关闭时取消所有任务
cancelToken.Cancel(); // 取消任务
cancelToken.Dispose();
cancelToken = new CancellationTokenSource();
}
};
/*var delayTimer = new DispatcherTimer();
delayTimer.Interval = TimeSpan.FromSeconds(5);
delayTimer.Tick += async (s, e) =>
{
delayTimer.Stop(); // 确保只执行一次
// 异步操作不会阻塞UI
await Current.Dispatcher.InvokeAsync(() =>
{
// 注册设置变更监听
SyncSetting.Instance.PropertyChanged += (s1, e1) =>
{
if (SyncSetting.Instance.IsOn)
{
// 异步启动服务
_ = StartSyncServicesAsync();
}
else
{
// 当设置关闭时取消所有任务
cancelToken.Cancel();
cancelToken.Dispose();
cancelToken = new CancellationTokenSource();
}
};
});
};
delayTimer.Start();*/
/*var syncSettingPath = SyncSetting.Instance.GetPath();
var syncSetting = xmlSerializerService.Load<SyncSetting>(syncSettingPath);
SyncSetting.Instance.IsOn = syncSetting.IsOn;
if (syncSetting.IsOn)
{
// 是否启监听
minioService.MirrorAsync1(bucketName, setting.SyncDir, setting.TaskCount);
}*/
/*minioService.RealTimeListen(bucketName, setting.SyncDir,
cancellationToken: cancelToken.Token);*/
}
private static string SelectDrive()
{
var maxFreeSpace = 0L;
var selectDrive = "";
// 如果同步目录为空,则选择一个本地空闲空间比较大的分区
foreach (DriveInfo drive in DriveInfo.GetDrives())
{
if (drive.DriveType != DriveType.Fixed) continue; // 只获取固定硬盘
if (drive.AvailableFreeSpace > maxFreeSpace)
{
maxFreeSpace = drive.AvailableFreeSpace;
selectDrive = drive.Name;
}
}
return selectDrive;
}
protected override void Configure(IApplicationBuilder app)
{
base.Configure(app);
app.UseSetting(x =>
{
x.Settings.Clear();
x.Settings.Add(MySetting.Instance);
x.Settings.Add(SyncSetting.Instance);
x.Settings.Add(DownloadSetting.Instance);
});
app.UseStyle();
//app.UseSettingDefault();
// Do设置默认主题
app.UseLocalTheme(l =>
{
// 主题色
l.AccentColor = (Color)ColorConverter.ConvertFromString("#FF0093FF");
l.DefaultFontSize = 13D;
l.FontSize = FontSize.Normal;
l.ItemHeight = 35;
//l.ItemWidth = 120;
l.ItemCornerRadius = 5;
l.AnimalSpeed = 300;
l.AccentColorSelectType = 0;
l.IsUseAnimal = false;
l.ThemeType = ThemeType.DarkBlack;
l.StyleType = StyleType.Single;
l.Language = Language.Chinese;
l.AccentBrushType = AccentBrushType.LinearGradientBrush;
});
}
}
[Displayer(Name = "下载设置", GroupName = "通用设置")]
public class DownloadSetting : LazySettingInstance<DownloadSetting>
{
private int _maxConcurrent;
[DefaultValue(3)]
[Display(Name = "下载并行任务数")]
public int MaxConcurrent
{
get => _maxConcurrent;
set
{
if (_maxConcurrent == value) return;
_maxConcurrent = value;
RaisePropertyChanged();
}
}
private string _downDir;
[Display(Name = "下载目录")]
public string DownDir
{
get => _downDir;
set
{
if (_downDir == value) return;
_downDir = value;
RaisePropertyChanged();
}
}
private bool _isSelect;
[DefaultValue(false)]
[Display(Name = "设置为默认下载目录")]
public bool IsSelect
{
get => _isSelect;
set
{
if (_isSelect == value) return;
_isSelect = value;
RaisePropertyChanged();
}
}
}
[Displayer(Name = "同步设置", GroupName = "通用设置")]
public class SyncSetting : LazySettingInstance<SyncSetting>
{
private bool _ison;
public string GetPath()
{
return GetDefaultPath();
}
[DefaultValue(false)]
[Display(Name = "自动同步")]
public bool IsOn
{
get { return _ison; }
set
{
if (_ison == value) return;
_ison = value;
RaisePropertyChanged();
}
}
}
[Displayer(Name = "关机设置", GroupName = "通用设置")]
public class MySetting : LazySettingInstance<MySetting>
{
private bool _ison;
[DefaultValue(false)]
[Display(Name = "是否上传完成关机")]
public bool IsOn
{
get { return _ison; }
set
{
_ison = value;
RaisePropertyChanged("IsOn");
}
}
}
}