2025-09-04 19:59:35 +08:00
|
|
|
|
using DMS.WPF.Interfaces;
|
2025-07-26 11:20:03 +08:00
|
|
|
|
using DMS.WPF.ViewModels;
|
2025-08-25 21:26:18 +08:00
|
|
|
|
using DMS.WPF.ViewModels.Items;
|
2025-07-26 11:20:03 +08:00
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
|
|
|
|
|
|
|
namespace DMS.WPF.Services;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// INavigationService 的实现,负责解析ViewModel并处理参数传递。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class NavigationService : INavigationService
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly IServiceProvider _serviceProvider;
|
2025-09-07 19:48:48 +08:00
|
|
|
|
private readonly INotificationService _notificationService;
|
2025-07-26 11:20:03 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 构造函数。
|
|
|
|
|
|
/// </summary>
|
2025-09-07 19:48:48 +08:00
|
|
|
|
public NavigationService(IServiceProvider serviceProvider,INotificationService notificationService)
|
2025-07-26 11:20:03 +08:00
|
|
|
|
{
|
|
|
|
|
|
_serviceProvider = serviceProvider;
|
2025-09-07 19:48:48 +08:00
|
|
|
|
_notificationService = notificationService;
|
2025-07-26 11:20:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 导航到指定键的视图,并传递参数。
|
|
|
|
|
|
/// </summary>
|
2025-07-30 12:09:00 +08:00
|
|
|
|
public async Task NavigateToAsync(MenuItemViewModel menu)
|
2025-07-26 11:20:03 +08:00
|
|
|
|
{
|
2025-07-30 12:09:00 +08:00
|
|
|
|
if (string.IsNullOrEmpty(menu.TargetViewKey))
|
2025-07-26 11:20:03 +08:00
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-26 18:58:52 +08:00
|
|
|
|
var mainViewModel = App.Current.Services.GetRequiredService<MainViewModel>();
|
2025-07-30 12:09:00 +08:00
|
|
|
|
var viewModel = GetViewModelByKey(menu.TargetViewKey);
|
2025-08-25 21:26:18 +08:00
|
|
|
|
if (viewModel == null)
|
|
|
|
|
|
{
|
2025-09-07 19:48:48 +08:00
|
|
|
|
_notificationService.ShowError($"切换界面失败,没有找到界面:{menu.TargetViewKey}");
|
2025-08-25 21:26:18 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-26 11:20:03 +08:00
|
|
|
|
|
|
|
|
|
|
if (viewModel is INavigatable navigatableViewModel)
|
|
|
|
|
|
{
|
2025-07-30 12:09:00 +08:00
|
|
|
|
await navigatableViewModel.OnNavigatedToAsync(menu);
|
2025-07-26 11:20:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
mainViewModel.CurrentViewModel = viewModel;
|
|
|
|
|
|
}
|
2025-09-11 11:04:07 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 导航到指定键的视图,并传递参数。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public async Task NavigateToAsync(string viewKey, object parameter = null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var mainViewModel = App.Current.Services.GetRequiredService<MainViewModel>();
|
|
|
|
|
|
var viewModel = GetViewModelByKey(viewKey);
|
|
|
|
|
|
if (viewModel == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
_notificationService.ShowError($"切换界面失败,没有找到界面:{viewKey}");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mainViewModel.CurrentViewModel = viewModel;
|
|
|
|
|
|
}
|
2025-07-26 11:20:03 +08:00
|
|
|
|
|
2025-07-26 12:19:05 +08:00
|
|
|
|
|
2025-07-26 18:58:52 +08:00
|
|
|
|
private ViewModelBase GetViewModelByKey(string key)
|
2025-07-26 11:20:03 +08:00
|
|
|
|
{
|
2025-09-07 19:48:48 +08:00
|
|
|
|
try
|
2025-07-26 18:58:52 +08:00
|
|
|
|
{
|
2025-09-07 19:48:48 +08:00
|
|
|
|
switch (key)
|
|
|
|
|
|
{
|
|
|
|
|
|
case "HomeView":
|
|
|
|
|
|
return App.Current.Services.GetRequiredService<HomeViewModel>();
|
|
|
|
|
|
case "DevicesView":
|
|
|
|
|
|
return App.Current.Services.GetRequiredService<DevicesViewModel>();
|
|
|
|
|
|
case "DeviceDetailView":
|
|
|
|
|
|
return App.Current.Services.GetRequiredService<DeviceDetailViewModel>();
|
|
|
|
|
|
case "DataTransformView":
|
|
|
|
|
|
return App.Current.Services.GetRequiredService<DataTransformViewModel>();
|
|
|
|
|
|
case "VariableTableView":
|
|
|
|
|
|
return App.Current.Services.GetRequiredService<VariableTableViewModel>();
|
2025-09-11 11:04:07 +08:00
|
|
|
|
case "VariableHistoryView":
|
|
|
|
|
|
return App.Current.Services.GetRequiredService<VariableHistoryViewModel>();
|
2025-09-07 19:48:48 +08:00
|
|
|
|
case "LogHistoryView":
|
|
|
|
|
|
return App.Current.Services.GetRequiredService<LogHistoryViewModel>();
|
|
|
|
|
|
case "MqttsView":
|
|
|
|
|
|
return App.Current.Services.GetRequiredService<MqttsViewModel>();
|
|
|
|
|
|
case "MqttServerDetailView":
|
|
|
|
|
|
return App.Current.Services.GetRequiredService<MqttServerDetailViewModel>();
|
|
|
|
|
|
case "SettingView":
|
|
|
|
|
|
return App.Current.Services.GetRequiredService<SettingViewModel>();
|
2025-09-13 19:08:43 +08:00
|
|
|
|
case "EmailManagementView":
|
|
|
|
|
|
return App.Current.Services.GetRequiredService<EmailManagementViewModel>();
|
2025-09-14 19:13:40 +08:00
|
|
|
|
case "TriggersView":
|
|
|
|
|
|
return App.Current.Services.GetRequiredService<TriggersViewModel>();
|
2025-09-07 19:48:48 +08:00
|
|
|
|
default:
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
|
{
|
|
|
|
|
|
_notificationService.ShowError($"切换界面失败,获取:{key}对应的ViewModel时发生了错误:{e.Message}");
|
|
|
|
|
|
throw;
|
2025-07-26 18:58:52 +08:00
|
|
|
|
}
|
2025-07-26 11:20:03 +08:00
|
|
|
|
}
|
2025-07-26 11:51:09 +08:00
|
|
|
|
}
|