using AuroraDesk.Core.Interfaces; using AuroraDesk.Core.Entities; using HeroIconsAvalonia.Enums; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using ReactiveUI; using System; using System.Collections.ObjectModel; namespace AuroraDesk.Infrastructure.Services; /// /// 导航服务实现 /// public class NavigationService : INavigationService { private readonly IPageViewModelFactory _pageViewModelFactory; private readonly IResourceService? _resourceService; private readonly ILogger? _logger; public NavigationService( IPageViewModelFactory pageViewModelFactory, IResourceService? resourceService = null, ILogger? logger = null) { _pageViewModelFactory = pageViewModelFactory; _resourceService = resourceService; _logger = logger; } public ObservableCollection GetNavigationItems(IScreen screen) { var navigationItems = new ObservableCollection { new NavigationItem { Id = "dashboard", Title = _resourceService?.GetString("NavDashboard") ?? "仪表板", IconType = IconType.Home, ViewModel = _pageViewModelFactory.CreatePageViewModel("dashboard", screen) }, new NavigationItem { Id = "users", Title = _resourceService?.GetString("NavUsers") ?? "用户管理", IconType = IconType.Users, Children = new ObservableCollection { new NavigationItem { Id = "users-list", Title = "用户列表", IconType = IconType.UserGroup, ViewModel = _pageViewModelFactory.CreatePageViewModel("users-list", screen) }, new NavigationItem { Id = "users-roles", Title = "角色管理", IconType = IconType.ShieldCheck, ViewModel = _pageViewModelFactory.CreatePageViewModel("users-roles", screen) }, new NavigationItem { Id = "users-permissions", Title = "权限设置", IconType = IconType.Key, ViewModel = _pageViewModelFactory.CreatePageViewModel("users-permissions", screen) } } }, new NavigationItem { Id = "settings", Title = _resourceService?.GetString("NavSettings") ?? "系统设置", IconType = IconType.Cog6Tooth, Children = new ObservableCollection { new NavigationItem { Id = "settings-general", Title = "常规设置", IconType = IconType.Cog, ViewModel = _pageViewModelFactory.CreatePageViewModel("settings-general", screen) }, new NavigationItem { Id = "settings-security", Title = "安全设置", IconType = IconType.LockClosed, ViewModel = _pageViewModelFactory.CreatePageViewModel("settings-security", screen) }, new NavigationItem { Id = "settings-backup", Title = "备份恢复", IconType = IconType.CloudArrowUp, ViewModel = _pageViewModelFactory.CreatePageViewModel("settings-backup", screen) } } }, new NavigationItem { Id = "reports", Title = _resourceService?.GetString("NavReports") ?? "报表统计", IconType = IconType.ChartBar, ViewModel = _pageViewModelFactory.CreatePageViewModel("reports", screen) }, new NavigationItem { Id = "help", Title = _resourceService?.GetString("NavHelp") ?? "帮助中心", IconType = IconType.QuestionMarkCircle, ViewModel = _pageViewModelFactory.CreatePageViewModel("help", screen) }, new NavigationItem { Id = "dialog-host", Title = "对话框示例", IconType = IconType.ChatBubbleLeftRight, ViewModel = _pageViewModelFactory.CreatePageViewModel("dialog-host", screen) }, new NavigationItem { Id = "icons", Title = _resourceService?.GetString("NavIcons") ?? "图标库", IconType = IconType.Sparkles, ViewModel = _pageViewModelFactory.CreatePageViewModel("icons", screen) }, new NavigationItem { Id = "editor", Title = "代码编辑器", IconType = IconType.CodeBracket, ViewModel = _pageViewModelFactory.CreatePageViewModel("editor", screen) }, new NavigationItem { Id = "image-gallery", Title = "图片浏览", IconType = IconType.Photo, ViewModel = _pageViewModelFactory.CreatePageViewModel("image-gallery", screen) }, new NavigationItem { Id = "udp-tools", Title = "UDP 工具", IconType = IconType.Signal, Children = new ObservableCollection { new NavigationItem { Id = "udp-client", Title = "UDP 客户端", IconType = IconType.ArrowRight, ViewModel = _pageViewModelFactory.CreatePageViewModel("udp-client", screen) }, new NavigationItem { Id = "udp-server", Title = "UDP 服务端", IconType = IconType.Server, ViewModel = _pageViewModelFactory.CreatePageViewModel("udp-server", screen) } } }, new NavigationItem { Id = "node-canvas", Title = "节点编辑器", IconType = IconType.SquaresPlus, ViewModel = _pageViewModelFactory.CreatePageViewModel("node-canvas", screen) } }; _logger?.LogInformation("导航项已初始化,共 {Count} 项", navigationItems.Count); return navigationItems; } public void NavigateToPage(NavigationItem item) { if (item?.ViewModel == null) { _logger?.LogWarning("导航项或 ViewModel 为空,无法导航"); return; } try { // 优化:如果当前 Router 已经显示的是这个 ViewModel,跳过导航避免重复渲染 if (item.ViewModel.HostScreen.Router.CurrentViewModel == item.ViewModel) { _logger?.LogDebug("页面已在当前视图,跳过导航: {Title} ({Id})", item.Title, item.Id); return; } // 从 ViewModel 获取 HostScreen 进行导航 item.ViewModel.HostScreen.Router.Navigate.Execute(item.ViewModel); _logger?.LogInformation("导航到页面: {Title} ({Id})", item.Title, item.Id); } catch (Exception ex) { _logger?.LogError(ex, "导航到页面失败: {Title}", item.Title); } } }