using SWRIS.Enums; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Globalization; using System.Windows.Data; using System.Windows.Media; namespace SWRIS.Converters { public class RiskLevelToColorConverter : IValueConverter { // 预定义颜色(非冻结的Color结构,轻量) private static readonly Color NormalColor = Color.FromRgb(0x00, 0xFF, 0x78); private static readonly Color MildColor = Color.FromRgb(0x00, 0xFF, 0x78); private static readonly Color LightColor = Color.FromRgb(0xFF, 0xF0, 0x00); private static readonly Color ModerateColor = Color.FromRgb(0xFF, 0x94, 0x00); private static readonly Color SevereColor = Color.FromRgb(0xFF, 0x6C, 0x00); private static readonly Color CriticalColor = Color.FromRgb(0xFF, 0x00, 0x00); private static readonly Color ExceededLimitColor = Color.FromRgb(0xFF, 0x00, 0x8A); // 映射枚举到颜色 private static readonly Dictionary ColorMap = new Dictionary { { RiskLevel.Normal, NormalColor }, { RiskLevel.Mild, MildColor }, { RiskLevel.Light, LightColor }, { RiskLevel.Moderate, ModerateColor }, { RiskLevel.Severe, SevereColor }, { RiskLevel.Critical, CriticalColor }, { RiskLevel.ExceededLimit, ExceededLimitColor } }; // 缓存:键为 "risk_opacity",值为冻结的SolidColorBrush private static readonly ConcurrentDictionary _brushCache = new ConcurrentDictionary(); public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is RiskLevel risk) { double opacity = 1.0; if (parameter != null) { // 尝试解析,若失败则使用默认1.0 double.TryParse(parameter.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out opacity); } // 构建缓存键 string cacheKey = $"{risk}_{opacity:F2}"; // 保留两位小数避免浮点数精度问题 // 如果缓存中存在,直接返回 if (_brushCache.TryGetValue(cacheKey, out var cachedBrush)) { return cachedBrush; } // 获取颜色 if (!ColorMap.TryGetValue(risk, out var color)) { color = NormalColor; // 默认 } // 创建新画笔并设置透明度 var brush = new SolidColorBrush(color); brush.Opacity = opacity; brush.Freeze(); // 冻结以便跨线程使用 // 缓存 _brushCache[cacheKey] = brush; return brush; } return Brushes.Transparent; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } }