|
|
@@ -49,7 +49,7 @@ public partial class DeviceDetailsWindow : Window
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
- ShowStatusMessage($"读取设备信息失败:{ex.Message}");
|
|
|
+ ShowStatusMessage($"读取设备信息失败:{ex.Message}", StatusMessageType.Error);
|
|
|
SetBusyState(false);
|
|
|
}
|
|
|
}
|
|
|
@@ -66,11 +66,11 @@ public partial class DeviceDetailsWindow : Window
|
|
|
var interfaces = await _serverApiService.GetInterfacesAsync(_baseAddress, _password, _localIPv4);
|
|
|
if (interfaces is null)
|
|
|
{
|
|
|
- ShowStatusMessage("设备已连接,但暂时无法读取 Linux 接口列表。");
|
|
|
+ ShowStatusMessage("设备已连接,但暂时无法读取 Linux 接口列表。", StatusMessageType.Warning);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- ShowStatusMessage($"当前管理接口:{interfaces.ManagementInterface}。正在读取全部接口配置。");
|
|
|
+ SetConfigStateMessage($"当前管理接口:{interfaces.ManagementInterface}。正在读取全部接口配置。", false);
|
|
|
foreach (var info in interfaces.Interfaces)
|
|
|
{
|
|
|
var editor = new InterfaceEditor(info);
|
|
|
@@ -80,7 +80,8 @@ public partial class DeviceDetailsWindow : Window
|
|
|
|
|
|
_configValidated = false;
|
|
|
_configDirty = false;
|
|
|
- ShowStatusMessage("已读取全部接口配置。");
|
|
|
+ SetConfigStateMessage("已读取全部接口配置。", false);
|
|
|
+ ShowStatusMessage("已读取全部接口配置。", StatusMessageType.Success);
|
|
|
}
|
|
|
|
|
|
private void ClearDetails()
|
|
|
@@ -115,7 +116,7 @@ public partial class DeviceDetailsWindow : Window
|
|
|
var result = await _serverApiService.GetInterfaceConfigAsync(_baseAddress, _password, _localIPv4, editor.SystemName);
|
|
|
if (!result.Success || result.Data is null)
|
|
|
{
|
|
|
- ShowStatusMessage($"读取目标接口 {editor.SystemName} 配置失败:{result.Message}");
|
|
|
+ ShowStatusMessage($"读取目标接口 {editor.SystemName} 配置失败:{result.Message}", StatusMessageType.Error);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -181,7 +182,8 @@ public partial class DeviceDetailsWindow : Window
|
|
|
|
|
|
_configValidated = false;
|
|
|
_configDirty = false;
|
|
|
- ShowStatusMessage("已刷新全部接口配置。");
|
|
|
+ SetConfigStateMessage("已刷新全部接口配置。", false);
|
|
|
+ ShowStatusMessage("已刷新全部接口配置。", StatusMessageType.Success);
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
@@ -224,11 +226,15 @@ public partial class DeviceDetailsWindow : Window
|
|
|
{
|
|
|
var warnings = result.Data.Warnings.Count > 0 ? $" 警告:{string.Join(";", result.Data.Warnings)}" : string.Empty;
|
|
|
var errors = result.Data.Errors.Count > 0 ? $" 错误:{string.Join(";", result.Data.Errors)}" : string.Empty;
|
|
|
- ShowStatusMessage(_configValidated ? $"全部接口校验通过,可应用配置。{warnings}" : $"校验失败。{errors}{warnings}");
|
|
|
+ SetConfigStateMessage(_configValidated ? "配置已校验通过,可以应用。" : "配置校验未通过,请修正后重新校验。", !_configValidated);
|
|
|
+ ShowStatusMessage(
|
|
|
+ _configValidated ? $"全部接口校验通过,可应用配置。{warnings}" : $"校验失败。{errors}{warnings}",
|
|
|
+ _configValidated ? StatusMessageType.Success : StatusMessageType.Error);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- ShowStatusMessage($"校验失败:{result.Message}");
|
|
|
+ SetConfigStateMessage("配置校验未通过,请修正后重新校验。", true);
|
|
|
+ ShowStatusMessage($"校验失败:{result.Message}", StatusMessageType.Error);
|
|
|
}
|
|
|
|
|
|
UpdateButtonStates();
|
|
|
@@ -259,11 +265,11 @@ public partial class DeviceDetailsWindow : Window
|
|
|
var applyResult = await _serverApiService.ApplyInterfaceConfigsAsync(_baseAddress, _password, _localIPv4, request);
|
|
|
if (!applyResult.Success || applyResult.Data is null)
|
|
|
{
|
|
|
- ShowStatusMessage($"提交配置任务失败:{applyResult.Message}");
|
|
|
+ ShowStatusMessage($"提交配置任务失败:{applyResult.Message}", StatusMessageType.Error);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- ShowStatusMessage("配置任务已提交,正在应用并等待连通确认...");
|
|
|
+ ShowStatusMessage("配置任务已提交,正在应用并等待连通确认...", StatusMessageType.Info);
|
|
|
await PollTaskAsync(applyResult.Data.TaskId);
|
|
|
}
|
|
|
finally
|
|
|
@@ -276,6 +282,7 @@ public partial class DeviceDetailsWindow : Window
|
|
|
{
|
|
|
var transientFailureCount = 0;
|
|
|
var confirmationRequested = false;
|
|
|
+ string? lastTaskMessage = null;
|
|
|
for (var i = 0; i < 20; i++)
|
|
|
{
|
|
|
await Task.Delay(1000);
|
|
|
@@ -285,17 +292,22 @@ public partial class DeviceDetailsWindow : Window
|
|
|
if (result.StatusCode is null)
|
|
|
{
|
|
|
transientFailureCount++;
|
|
|
- ShowStatusMessage($"设备连接短暂中断,正在重试({transientFailureCount})。");
|
|
|
+ ShowStatusMessage($"设备连接短暂中断,正在重试({transientFailureCount})。", StatusMessageType.Warning);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- ShowStatusMessage($"读取任务状态失败:{result.Message}");
|
|
|
+ ShowStatusMessage($"读取任务状态失败:{result.Message}", StatusMessageType.Error);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
transientFailureCount = 0;
|
|
|
var task = result.Data;
|
|
|
- ShowStatusMessage(FormatTaskStatusMessage(task));
|
|
|
+ var (taskMessage, taskMessageType) = FormatTaskStatusMessage(task);
|
|
|
+ if (!string.Equals(taskMessage, lastTaskMessage, StringComparison.Ordinal))
|
|
|
+ {
|
|
|
+ lastTaskMessage = taskMessage;
|
|
|
+ ShowStatusMessage(taskMessage, taskMessageType);
|
|
|
+ }
|
|
|
if (task.Status == "running" && task.Step == "confirming" && !confirmationRequested)
|
|
|
{
|
|
|
confirmationRequested = true;
|
|
|
@@ -303,17 +315,28 @@ public partial class DeviceDetailsWindow : Window
|
|
|
if (confirm)
|
|
|
{
|
|
|
var confirmResult = await _serverApiService.ConfirmApplyTaskAsync(_baseAddress, _password, _localIPv4, taskId);
|
|
|
- ShowStatusMessage(confirmResult.Success ? "已发送保留配置确认。" : $"发送确认失败:{confirmResult.Message}");
|
|
|
+ ShowStatusMessage(
|
|
|
+ confirmResult.Success ? "已发送保留配置确认。" : $"发送确认失败:{confirmResult.Message}",
|
|
|
+ confirmResult.Success ? StatusMessageType.Success : StatusMessageType.Error);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
var cancelResult = await _serverApiService.CancelApplyTaskAsync(_baseAddress, _password, _localIPv4, taskId);
|
|
|
- ShowStatusMessage(cancelResult.Success ? "已取消保留配置,正在回滚。" : $"发送取消失败:{cancelResult.Message}");
|
|
|
+ ShowStatusMessage(
|
|
|
+ cancelResult.Success ? "已取消保留配置,正在回滚。" : $"发送取消失败:{cancelResult.Message}",
|
|
|
+ cancelResult.Success ? StatusMessageType.Warning : StatusMessageType.Error);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (task.Status is "success" or "failed" or "rolled_back")
|
|
|
{
|
|
|
+ if (task.Status == "success")
|
|
|
+ {
|
|
|
+ _configValidated = false;
|
|
|
+ _configDirty = false;
|
|
|
+ SetConfigStateMessage("配置已应用,当前显示为设备最新配置。", false);
|
|
|
+ }
|
|
|
+
|
|
|
ShowTaskCompletionDialog(task);
|
|
|
foreach (var editor in _interfaces)
|
|
|
{
|
|
|
@@ -324,7 +347,7 @@ public partial class DeviceDetailsWindow : Window
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- ShowStatusMessage($"任务 {taskId} 轮询超时,请稍后手动刷新。");
|
|
|
+ ShowStatusMessage($"任务 {taskId} 轮询超时,请稍后手动刷新。", StatusMessageType.Warning);
|
|
|
}
|
|
|
|
|
|
private bool ShowApplyConfirmationDialog(int timeoutSeconds)
|
|
|
@@ -441,11 +464,11 @@ public partial class DeviceDetailsWindow : Window
|
|
|
var result = await action();
|
|
|
if (!result.Success || result.Data is null)
|
|
|
{
|
|
|
- ShowStatusMessage($"{title}失败:{result.Message}");
|
|
|
+ ShowStatusMessage($"{title}失败:{result.Message}", StatusMessageType.Error);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- ShowStatusMessage($"{title}任务已提交:{result.Data.TaskId}。命令已发出,设备可能立即断开。");
|
|
|
+ ShowStatusMessage($"{title}任务已提交:{result.Data.TaskId}。命令已发出,设备可能立即断开。", StatusMessageType.Success);
|
|
|
}
|
|
|
|
|
|
private RemoteInterfaceConfig[]? BuildConfigRequests()
|
|
|
@@ -465,7 +488,7 @@ public partial class DeviceDetailsWindow : Window
|
|
|
|
|
|
if (result.Count == 0)
|
|
|
{
|
|
|
- ShowStatusMessage("接口配置不能为空。");
|
|
|
+ ShowStatusMessage("接口配置不能为空。", StatusMessageType.Error);
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
@@ -481,19 +504,19 @@ public partial class DeviceDetailsWindow : Window
|
|
|
{
|
|
|
if (editor.Addresses.All(item => string.IsNullOrWhiteSpace(item.IP) && string.IsNullOrWhiteSpace(item.Mask)))
|
|
|
{
|
|
|
- ShowStatusMessage($"{editor.SystemName}:IP 地址不能为空,至少需要填写一行地址。");
|
|
|
+ ShowStatusMessage($"{editor.SystemName}:IP 地址不能为空,至少需要填写一行地址。", StatusMessageType.Error);
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
if (!TryBuildAddresses(editor, out addresses, out var addressError))
|
|
|
{
|
|
|
- ShowStatusMessage($"{editor.SystemName}:{addressError}");
|
|
|
+ ShowStatusMessage($"{editor.SystemName}:{addressError}", StatusMessageType.Error);
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
if (!TryBuildRoutes(editor, out routes, out var routeError))
|
|
|
{
|
|
|
- ShowStatusMessage($"{editor.SystemName}:{routeError}");
|
|
|
+ ShowStatusMessage($"{editor.SystemName}:{routeError}", StatusMessageType.Error);
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
@@ -829,7 +852,8 @@ public partial class DeviceDetailsWindow : Window
|
|
|
}
|
|
|
|
|
|
_configValidated = false;
|
|
|
- ShowStatusMessage("配置内容已变更,请重新点击“2. 校验配置”。");
|
|
|
+ _configDirty = true;
|
|
|
+ SetConfigStateMessage("配置已修改,需重新校验后才能应用。", true);
|
|
|
UpdateButtonStates();
|
|
|
}
|
|
|
|
|
|
@@ -843,7 +867,7 @@ public partial class DeviceDetailsWindow : Window
|
|
|
|
|
|
_configValidated = false;
|
|
|
_configDirty = true;
|
|
|
- ShowStatusMessage("配置模式已变更,请重新点击“2. 校验配置”。");
|
|
|
+ SetConfigStateMessage("配置已修改,需重新校验后才能应用。", true);
|
|
|
UpdateButtonStates();
|
|
|
}
|
|
|
|
|
|
@@ -857,7 +881,7 @@ public partial class DeviceDetailsWindow : Window
|
|
|
|
|
|
_configValidated = false;
|
|
|
_configDirty = true;
|
|
|
- ShowStatusMessage("配置内容已变更,请重新点击“2. 校验配置”。");
|
|
|
+ SetConfigStateMessage("配置已修改,需重新校验后才能应用。", true);
|
|
|
UpdateButtonStates();
|
|
|
}
|
|
|
|
|
|
@@ -871,7 +895,7 @@ public partial class DeviceDetailsWindow : Window
|
|
|
{
|
|
|
NormalizeRouteRow(route);
|
|
|
}
|
|
|
- MarkConfigChanged("配置内容已变更,请重新点击“2. 校验配置”。");
|
|
|
+ MarkConfigChanged();
|
|
|
}
|
|
|
|
|
|
private void DataGrid_OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
|
|
|
@@ -897,7 +921,7 @@ public partial class DeviceDetailsWindow : Window
|
|
|
return;
|
|
|
}
|
|
|
editor.Addresses.Add(new EditableAddress(editor) { Mask = "255.255.255.0" });
|
|
|
- MarkConfigChanged("已添加 IP 地址,请填写后重新校验配置。");
|
|
|
+ MarkConfigChanged();
|
|
|
}
|
|
|
|
|
|
private void AddRouteButton_OnClick(object sender, RoutedEventArgs e)
|
|
|
@@ -907,7 +931,7 @@ public partial class DeviceDetailsWindow : Window
|
|
|
return;
|
|
|
}
|
|
|
editor.Routes.Add(new EditableRoute(editor));
|
|
|
- MarkConfigChanged("已添加路由,请填写后重新校验配置。");
|
|
|
+ MarkConfigChanged();
|
|
|
}
|
|
|
|
|
|
private void AddDnsButton_OnClick(object sender, RoutedEventArgs e)
|
|
|
@@ -917,7 +941,7 @@ public partial class DeviceDetailsWindow : Window
|
|
|
return;
|
|
|
}
|
|
|
editor.Dns.Add(new EditableDns(editor));
|
|
|
- MarkConfigChanged("已添加 DNS,请填写后重新校验配置。");
|
|
|
+ MarkConfigChanged();
|
|
|
}
|
|
|
|
|
|
private void DeleteAddressButton_OnClick(object sender, RoutedEventArgs e)
|
|
|
@@ -927,7 +951,7 @@ public partial class DeviceDetailsWindow : Window
|
|
|
return;
|
|
|
}
|
|
|
address.Owner.Addresses.Remove(address);
|
|
|
- MarkConfigChanged("已删除 IP 地址,请重新校验配置。");
|
|
|
+ MarkConfigChanged();
|
|
|
}
|
|
|
|
|
|
private void DeleteRouteButton_OnClick(object sender, RoutedEventArgs e)
|
|
|
@@ -935,7 +959,7 @@ public partial class DeviceDetailsWindow : Window
|
|
|
if ((sender as FrameworkElement)?.DataContext is EditableRoute route)
|
|
|
{
|
|
|
route.Owner.Routes.Remove(route);
|
|
|
- MarkConfigChanged("已删除路由,请重新校验配置。");
|
|
|
+ MarkConfigChanged();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -944,11 +968,11 @@ public partial class DeviceDetailsWindow : Window
|
|
|
if ((sender as FrameworkElement)?.DataContext is EditableDns dns)
|
|
|
{
|
|
|
dns.Owner.Dns.Remove(dns);
|
|
|
- MarkConfigChanged("已删除 DNS,请重新校验配置。");
|
|
|
+ MarkConfigChanged();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void MarkConfigChanged(string message)
|
|
|
+ private void MarkConfigChanged()
|
|
|
{
|
|
|
if (_suppressConfigChangeHandling)
|
|
|
{
|
|
|
@@ -957,10 +981,18 @@ public partial class DeviceDetailsWindow : Window
|
|
|
|
|
|
_configValidated = false;
|
|
|
_configDirty = true;
|
|
|
- ShowStatusMessage(message);
|
|
|
+ SetConfigStateMessage("配置已修改,需重新校验后才能应用。", true);
|
|
|
UpdateButtonStates();
|
|
|
}
|
|
|
|
|
|
+ private void SetConfigStateMessage(string message, bool requiresAttention)
|
|
|
+ {
|
|
|
+ ConfigStateTextBlock.Text = message;
|
|
|
+ ConfigStateTextBlock.Foreground = requiresAttention
|
|
|
+ ? new SolidColorBrush((Color)ColorConverter.ConvertFromString("#C2410C"))
|
|
|
+ : new SolidColorBrush((Color)ColorConverter.ConvertFromString("#6B7280"));
|
|
|
+ }
|
|
|
+
|
|
|
private static void NormalizeAddressRow(EditableAddress row)
|
|
|
{
|
|
|
var ip = row.IP.Trim();
|
|
|
@@ -991,9 +1023,9 @@ public partial class DeviceDetailsWindow : Window
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void ShowStatusMessage(string message)
|
|
|
+ private void ShowStatusMessage(string message, StatusMessageType type)
|
|
|
{
|
|
|
- ApplyStatusMessageStyle(message);
|
|
|
+ ApplyStatusMessageStyle(type);
|
|
|
StatusMessageTextBlock.Text = message;
|
|
|
StatusMessageBorder.Opacity = 0;
|
|
|
StatusMessageBorder.Visibility = Visibility.Visible;
|
|
|
@@ -1026,60 +1058,47 @@ public partial class DeviceDetailsWindow : Window
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void ApplyStatusMessageStyle(string message)
|
|
|
+ private void ApplyStatusMessageStyle(StatusMessageType type)
|
|
|
{
|
|
|
- var (background, foreground) = GetStatusMessageBrushes(message);
|
|
|
- StatusMessageBorder.Background = background;
|
|
|
- StatusMessageTextBlock.Foreground = foreground;
|
|
|
+ var (background, icon) = GetStatusMessageVisuals(type);
|
|
|
+ StatusIconBorder.Background = background;
|
|
|
+ StatusIconTextBlock.Text = icon;
|
|
|
+ StatusMessageTextBlock.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#1F2937"));
|
|
|
}
|
|
|
|
|
|
- private static (Brush Background, Brush Foreground) GetStatusMessageBrushes(string message)
|
|
|
+ private static (Brush Background, string Icon) GetStatusMessageVisuals(StatusMessageType type)
|
|
|
{
|
|
|
- if (ContainsAny(message, "失败", "错误", "拒绝", "超时", "不能为空", "不正确", "无法"))
|
|
|
+ return type switch
|
|
|
{
|
|
|
- return (new SolidColorBrush((Color)ColorConverter.ConvertFromString("#B91C1C")), Brushes.White);
|
|
|
- }
|
|
|
-
|
|
|
- if (ContainsAny(message, "未发现", "请", "重试", "警告", "需要"))
|
|
|
- {
|
|
|
- return (new SolidColorBrush((Color)ColorConverter.ConvertFromString("#C2410C")), Brushes.White);
|
|
|
- }
|
|
|
-
|
|
|
- if (ContainsAny(message, "成功", "已切换", "已刷新", "已读取", "已加载", "已发现", "已提交", "已回填"))
|
|
|
- {
|
|
|
- return (new SolidColorBrush((Color)ColorConverter.ConvertFromString("#047857")), Brushes.White);
|
|
|
- }
|
|
|
-
|
|
|
- return (new SolidColorBrush((Color)ColorConverter.ConvertFromString("#111827")), Brushes.White);
|
|
|
- }
|
|
|
-
|
|
|
- private static bool ContainsAny(string message, params string[] markers)
|
|
|
- {
|
|
|
- return markers.Any(marker => message.Contains(marker, StringComparison.Ordinal));
|
|
|
+ StatusMessageType.Success => (new SolidColorBrush((Color)ColorConverter.ConvertFromString("#27C346")), "✓"),
|
|
|
+ StatusMessageType.Error => (new SolidColorBrush((Color)ColorConverter.ConvertFromString("#F76965")), "×"),
|
|
|
+ StatusMessageType.Warning => (new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF9626")), "!"),
|
|
|
+ _ => (new SolidColorBrush((Color)ColorConverter.ConvertFromString("#508DF8")), "i"),
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
- private static string FormatTaskStatusMessage(RemoteTaskResult task)
|
|
|
+ private static (string Message, StatusMessageType Type) FormatTaskStatusMessage(RemoteTaskResult task)
|
|
|
{
|
|
|
return task.Status switch
|
|
|
{
|
|
|
- "success" => string.IsNullOrWhiteSpace(task.Detail) ? "配置已成功应用。" : task.Detail,
|
|
|
- "failed" => string.IsNullOrWhiteSpace(task.Detail) ? "配置应用失败。" : task.Detail,
|
|
|
- "rolled_back" => string.IsNullOrWhiteSpace(task.Detail) ? "配置应用失败,已自动回滚。" : task.Detail,
|
|
|
+ "success" => (string.IsNullOrWhiteSpace(task.Detail) ? "配置已成功应用。" : task.Detail, StatusMessageType.Success),
|
|
|
+ "failed" => (string.IsNullOrWhiteSpace(task.Detail) ? "配置应用失败。" : task.Detail, StatusMessageType.Error),
|
|
|
+ "rolled_back" => (string.IsNullOrWhiteSpace(task.Detail) ? "配置应用失败,已自动回滚。" : task.Detail, StatusMessageType.Error),
|
|
|
_ => task.Step switch
|
|
|
{
|
|
|
- "validating" => "正在校验配置...",
|
|
|
- "writing_netplan" => "正在写入 Linux 网络配置...",
|
|
|
- "applying" => "正在应用 Linux 网络配置...",
|
|
|
- "confirming" => string.IsNullOrWhiteSpace(task.Detail) ? "等待确认保留配置..." : task.Detail,
|
|
|
- "rolling_back" => "配置应用失败,正在自动回滚...",
|
|
|
- _ => string.IsNullOrWhiteSpace(task.Detail) ? "正在处理,请稍候..." : task.Detail,
|
|
|
+ "validating" => ("正在校验配置...", StatusMessageType.Info),
|
|
|
+ "writing_netplan" => ("正在写入 Linux 网络配置...", StatusMessageType.Info),
|
|
|
+ "applying" => ("正在应用 Linux 网络配置...", StatusMessageType.Info),
|
|
|
+ "confirming" => (string.IsNullOrWhiteSpace(task.Detail) ? "等待确认保留配置..." : task.Detail, StatusMessageType.Warning),
|
|
|
+ "rolling_back" => ("配置应用失败,正在自动回滚...", StatusMessageType.Warning),
|
|
|
+ _ => (string.IsNullOrWhiteSpace(task.Detail) ? "正在处理,请稍候..." : task.Detail, StatusMessageType.Info),
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
private void ShowTaskCompletionDialog(RemoteTaskResult task)
|
|
|
{
|
|
|
- var message = FormatTaskStatusMessage(task);
|
|
|
+ var (message, _) = FormatTaskStatusMessage(task);
|
|
|
var title = task.Status == "success" ? "应用配置成功" : "应用配置失败";
|
|
|
var image = task.Status == "success" ? MessageBoxImage.Information : MessageBoxImage.Warning;
|
|
|
MessageBox.Show(this, message, title, MessageBoxButton.OK, image);
|