RiskLevelToColorConverter.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using SWRIS.Enums;
  2. using System;
  3. using System.Collections.Concurrent;
  4. using System.Collections.Generic;
  5. using System.Globalization;
  6. using System.Windows.Data;
  7. using System.Windows.Media;
  8. namespace SWRIS.Converters
  9. {
  10. public class RiskLevelToColorConverter : IValueConverter
  11. {
  12. // 预定义颜色(非冻结的Color结构,轻量)
  13. private static readonly Color NormalColor = Color.FromRgb(0x00, 0xFF, 0x78);
  14. private static readonly Color MildColor = Color.FromRgb(0x00, 0xFF, 0x78);
  15. private static readonly Color LightColor = Color.FromRgb(0xFF, 0xF0, 0x00);
  16. private static readonly Color ModerateColor = Color.FromRgb(0xFF, 0x94, 0x00);
  17. private static readonly Color SevereColor = Color.FromRgb(0xFF, 0x6C, 0x00);
  18. private static readonly Color CriticalColor = Color.FromRgb(0xFF, 0x00, 0x00);
  19. private static readonly Color ExceededLimitColor = Color.FromRgb(0xFF, 0x00, 0x8A);
  20. // 映射枚举到颜色
  21. private static readonly Dictionary<RiskLevel, Color> ColorMap = new Dictionary<RiskLevel, Color>
  22. {
  23. { RiskLevel.Normal, NormalColor },
  24. { RiskLevel.Mild, MildColor },
  25. { RiskLevel.Light, LightColor },
  26. { RiskLevel.Moderate, ModerateColor },
  27. { RiskLevel.Severe, SevereColor },
  28. { RiskLevel.Critical, CriticalColor },
  29. { RiskLevel.ExceededLimit, ExceededLimitColor }
  30. };
  31. // 缓存:键为 "risk_opacity",值为冻结的SolidColorBrush
  32. private static readonly ConcurrentDictionary<string, SolidColorBrush> _brushCache = new ConcurrentDictionary<string, SolidColorBrush>();
  33. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  34. {
  35. if (value is RiskLevel risk)
  36. {
  37. double opacity = 1.0;
  38. if (parameter != null)
  39. {
  40. // 尝试解析,若失败则使用默认1.0
  41. double.TryParse(parameter.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out opacity);
  42. }
  43. // 构建缓存键
  44. string cacheKey = $"{risk}_{opacity:F2}"; // 保留两位小数避免浮点数精度问题
  45. // 如果缓存中存在,直接返回
  46. if (_brushCache.TryGetValue(cacheKey, out var cachedBrush))
  47. {
  48. return cachedBrush;
  49. }
  50. // 获取颜色
  51. if (!ColorMap.TryGetValue(risk, out var color))
  52. {
  53. color = NormalColor; // 默认
  54. }
  55. // 创建新画笔并设置透明度
  56. var brush = new SolidColorBrush(color);
  57. brush.Opacity = opacity;
  58. brush.Freeze(); // 冻结以便跨线程使用
  59. // 缓存
  60. _brushCache[cacheKey] = brush;
  61. return brush;
  62. }
  63. return Brushes.Transparent;
  64. }
  65. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  66. {
  67. throw new NotImplementedException();
  68. }
  69. }
  70. }