using DMS.Core.Models; using DMS.WPF.Interfaces; using DMS.WPF.ViewModels; using DMS.WPF.ViewModels.Items; using DMS.WPF.Views; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; namespace DMS.WPF.Services; /// /// INavigationService 的实现,负责解析ViewModel并处理参数传递。 /// public class NavigationService : INavigationService { private readonly IServiceProvider _serviceProvider; private readonly INotificationService _notificationService; /// /// 构造函数。 /// public NavigationService(IServiceProvider serviceProvider,INotificationService notificationService) { _serviceProvider = serviceProvider; _notificationService = notificationService; } /// /// 导航到指定键的视图,并传递参数。 /// public async Task NavigateToAsync(object sender,NavigationParameter parameter) { if (parameter == null || string.IsNullOrWhiteSpace(parameter.TargetViewKey) )return; var viewModel = GetViewModelByKey(parameter.TargetViewKey); if (viewModel == null) { _notificationService.ShowError($"切换界面失败,没有找到界面:{parameter.TargetViewKey}"); return; } if (sender is INavigatable fromViewModel) { await fromViewModel.OnNavigatedFromAsync(parameter); } var mainViewModel = App.Current.Services.GetRequiredService(); mainViewModel.CurrentViewModel = viewModel; if (viewModel is INavigatable toViewModel) { await toViewModel.OnNavigatedToAsync(parameter); } } private ViewModelBase GetViewModelByKey(string key) { try { switch (key) { case nameof(HomeViewModel): return App.Current.Services.GetRequiredService(); case nameof(DevicesViewModel): return App.Current.Services.GetRequiredService(); case nameof(DeviceDetailViewModel): return App.Current.Services.GetRequiredService(); case nameof(DataTransformViewModel): return App.Current.Services.GetRequiredService(); case nameof(VariableTableViewModel): return App.Current.Services.GetRequiredService(); case nameof(VariableHistoryViewModel): return App.Current.Services.GetRequiredService(); case nameof(LogHistoryViewModel): return App.Current.Services.GetRequiredService(); case nameof(MqttsViewModel): return App.Current.Services.GetRequiredService(); case nameof(MqttServerDetailViewModel): return App.Current.Services.GetRequiredService(); case nameof(SettingViewModel): return App.Current.Services.GetRequiredService(); case nameof(EmailManagementViewModel): return App.Current.Services.GetRequiredService(); case nameof(TriggersViewModel): return App.Current.Services.GetRequiredService(); default: return null; } } catch (Exception e) { _notificationService.ShowError($"切换界面失败,获取:{key}对应的ViewModel时发生了错误:{e.Message}"); throw; } } }