feat: v1.2.0 开发进度更新
### 新增功能 - **Linux 官方支持**:新增 Hua.Todo.Avalonia 项目,正式适配 Linux 平台,同时支持 Windows 和 macOS - **Avalonia 桌面交互**:增加托盘菜单(显示/退出)、关闭隐藏到托盘、Windows 全局热键唤起主窗口、热键配置本地持久化 - **SQLite DateTime 兼容修复**:新增 LenientUtcDateTimeStringConverter,解决历史遗留的 DateTime 脏数据解析问题 - **用户文档完善**:新增 docs/manual/新手指南.md 和 docs/manual/用户指南.md - **部署文档**:新增 docs/manual/部署文档.md,详细说明多平台发布流程 ### 优化与修复 - **发布脚本整理**:拆分/对齐各平台发布入口,新增 publish.ps1 作为统一入口 - **Windows WebView2 优化**:数据目录调整到 %LocalAppData%\Hua.Todo\WebView2,修复 Runtime 误判问题 - **MAUI 多平台构建**:在 Windows 开发机上默认仅构建 Android + Windows 目标 - **SPA 路由回落**:修复 Release 模式下 /swagger 路径的 404 问题 - **Swagger 输出**:补齐 Dynamic API 端点,避免接口缺失 ### 文档更新 - **版本记录**:更新 v1.2.0 开发进度和功能列表 - **技术设计文档**:添加 Avalonia 项目架构和模块设计 - **项目结构**:更新 README.md 中的项目结构说明 ### 其他变更 - 新增 Directory.Build.props 和更新 Directory.Build.targets - 调整 src/Hua.Todo.Avalonia 项目配置和资源文件 - 更新 src/Hua.Todo.Web 前端资源文件 - 修复 src/Hua.Todo.Maui 相关配置和打包脚本
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Controls.ApplicationLifetimes;
|
||||
using Avalonia.Data.Core.Plugins;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using Avalonia.Platform;
|
||||
using Avalonia.Threading;
|
||||
using AvaloniaWebView;
|
||||
using Hua.Todo.Avalonia.Models;
|
||||
@@ -13,7 +13,6 @@ using Hua.Todo.Avalonia.Views;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@@ -98,9 +97,7 @@ public partial class App : global::Avalonia.Application
|
||||
{
|
||||
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
||||
{
|
||||
DisableAvaloniaDataAnnotationValidation();
|
||||
|
||||
_webServer = new EmbeddedWebServerService(_appSettings!);
|
||||
_webServer = EmbeddedWebServerServiceFactory.Create(_appSettings!);
|
||||
_ = Task.Run(async () =>
|
||||
{
|
||||
try
|
||||
@@ -132,10 +129,16 @@ public partial class App : global::Avalonia.Application
|
||||
};
|
||||
}
|
||||
|
||||
DataContext = new AppTrayViewModel(
|
||||
AppMetadata.GetTrayTooltipText(),
|
||||
ShowMainWindow,
|
||||
() => ExitApplication(desktop));
|
||||
// 只在支持的平台上初始化系统托盘
|
||||
if (OperatingSystem.IsWindows() || OperatingSystem.IsLinux())
|
||||
{
|
||||
var trayViewModel = new AppTrayViewModel(
|
||||
AppMetadata.GetTrayTooltipText(),
|
||||
ShowMainWindow,
|
||||
() => ExitApplication(desktop));
|
||||
|
||||
InitializeTrayIcon(trayViewModel);
|
||||
}
|
||||
|
||||
_mainWindow = new MainWindow(_appSettings!, _webServer)
|
||||
{
|
||||
@@ -185,6 +188,12 @@ public partial class App : global::Avalonia.Application
|
||||
}
|
||||
};
|
||||
}
|
||||
else if (ApplicationLifetime is ISingleViewApplicationLifetime singleView)
|
||||
{
|
||||
_webServer = EmbeddedWebServerServiceFactory.Create(_appSettings!);
|
||||
|
||||
singleView.MainView = new MainView(_appSettings!, _webServer);
|
||||
}
|
||||
|
||||
base.OnFrameworkInitializationCompleted();
|
||||
}
|
||||
@@ -257,14 +266,43 @@ public partial class App : global::Avalonia.Application
|
||||
}
|
||||
}
|
||||
|
||||
private void DisableAvaloniaDataAnnotationValidation()
|
||||
private void InitializeTrayIcon(AppTrayViewModel trayViewModel)
|
||||
{
|
||||
var dataValidationPluginsToRemove =
|
||||
BindingPlugins.DataValidators.OfType<DataAnnotationsValidationPlugin>().ToArray();
|
||||
|
||||
foreach (var plugin in dataValidationPluginsToRemove)
|
||||
try
|
||||
{
|
||||
BindingPlugins.DataValidators.Remove(plugin);
|
||||
var trayIcons = new TrayIcons();
|
||||
|
||||
var iconUri = new Uri("avares://Hua.Todo.Avalonia/Assets/avalonia-logo.ico");
|
||||
var icon = new WindowIcon(AssetLoader.Open(iconUri));
|
||||
|
||||
var trayIcon = new TrayIcon
|
||||
{
|
||||
Icon = icon,
|
||||
ToolTipText = trayViewModel.TrayTooltipText,
|
||||
Command = trayViewModel.ShowMainWindowCommand
|
||||
};
|
||||
|
||||
var menu = new NativeMenu();
|
||||
menu.Items.Add(new NativeMenuItem
|
||||
{
|
||||
Header = "显示主窗口",
|
||||
Command = trayViewModel.ShowMainWindowCommand
|
||||
});
|
||||
menu.Items.Add(new NativeMenuItemSeparator());
|
||||
menu.Items.Add(new NativeMenuItem
|
||||
{
|
||||
Header = "退出",
|
||||
Command = trayViewModel.ExitApplicationCommand
|
||||
});
|
||||
|
||||
trayIcon.Menu = menu;
|
||||
trayIcons.Add(trayIcon);
|
||||
|
||||
TrayIcon.SetIcons(this, trayIcons);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[App] Tray icon initialization failed: {ex}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user