using System.Globalization; using System.Windows; using System.Windows.Data; using System.Windows.Media; // 双开 WPF + WinForms 时,这几个类型两个命名空间都有,固定走 WPF 的。 using Application = System.Windows.Application; using Color = System.Windows.Media.Color; using Brush = System.Windows.Media.Brush; namespace WindowsGotify; public sealed class PriorityToBrushConverter : IValueConverter { public object Convert(object value, Type targetType, object? parameter, CultureInfo culture) { if (parameter is string p && p == "hideIfEmpty" && value is string s) { return string.IsNullOrWhiteSpace(s) || s == "(无标题)" ? Visibility.Collapsed : Visibility.Visible; } if (value is int p1) { // 从主题字典里取色,跟着 Theme 切换走 var key = p1 switch { >= 8 => "PriorityUrgent", >= 5 => "PriorityHigh", >= 1 => "PriorityNormal", _ => "PriorityLow" }; if (Application.Current?.TryFindResource(key) is Brush b) return b; return new SolidColorBrush(Colors.Gray); } return new SolidColorBrush(Colors.Gray); } public object ConvertBack(object value, Type targetType, object? parameter, CultureInfo culture) => throw new NotSupportedException(); } /// /// 应用名 → 稳定颜色(用名字的 hash 决定 hue),让每个应用在历史里视觉上可区分。 /// public sealed class AppNameToBrushConverter : IValueConverter { public object Convert(object value, Type targetType, object? parameter, CultureInfo culture) { var name = value as string ?? ""; if (string.IsNullOrWhiteSpace(name)) return new SolidColorBrush(Color.FromRgb(0x55, 0x55, 0x55)); // 简单 FNV-1a 32-bit hash → hue 0..360 uint hash = 2166136261u; foreach (var c in name) { hash ^= c; hash *= 16777619u; } var hue = hash % 360; return new SolidColorBrush(HsvToColor(hue, 0.55, 0.75)); } private static Color HsvToColor(double hue, double sat, double val) { var c = val * sat; var x = c * (1 - Math.Abs((hue / 60) % 2 - 1)); var m = val - c; double r, g, b; if (hue < 60) { r = c; g = x; b = 0; } else if (hue < 120) { r = x; g = c; b = 0; } else if (hue < 180) { r = 0; g = c; b = x; } else if (hue < 240) { r = 0; g = x; b = c; } else if (hue < 300) { r = x; g = 0; b = c; } else { r = c; g = 0; b = x; } return Color.FromRgb( (byte)Math.Round((r + m) * 255), (byte)Math.Round((g + m) * 255), (byte)Math.Round((b + m) * 255)); } public object ConvertBack(object value, Type targetType, object? parameter, CultureInfo culture) => throw new NotSupportedException(); }