using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using HandyControl.Controls; using HandyControl.Tools; namespace SparkClient.Views.Configuration.SettingPages; public partial class ModelColorSetPage { public ModelColorSetPage() { InitializeComponent(); } private void LabelsColor_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (sender is Label label) { var picker = SingleOpenHelper.CreateControl(); var window = new PopupWindow { PopupElement = picker }; picker.SelectedBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString((label.Content??"#FFFFFF").ToString())); picker.Canceled += delegate { window.Close(); }; picker.Confirmed += delegate { label.Background = picker.SelectedBrush; label.Foreground = picker.SelectedBrush; label.Content = picker.SelectedBrush.ToString(); window.Close(); }; window.Show(label, false); } } public SolidColorBrush GetInverseBrush(SolidColorBrush selectedBrush) { Color originalColor = selectedBrush.Color; Color inverseColor = Color.FromRgb((byte)(255 - originalColor.R), (byte)(255 - originalColor.G), (byte)(255 - originalColor.B)); return new SolidColorBrush(inverseColor); } private void Label_ContentChanged(object sender, RoutedEventArgs e) { if (e.Source is Label label) { var newContent = label.Content?.ToString(); // 在这里处理 Content 变化后的逻辑 // 例如: label.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString(newContent)); #if DEBUG label.Foreground = GetInverseBrush(new SolidColorBrush((Color)ColorConverter.ConvertFromString(newContent))); #else label.Foreground = new SolidColorBrush(Colors.Transparent); #endif } } } public static class LabelContentChangedBehavior { public static readonly DependencyProperty EnableContentChangedProperty = DependencyProperty.RegisterAttached( "EnableContentChanged", typeof(bool), typeof(LabelContentChangedBehavior), new PropertyMetadata(false, OnEnableContentChangedChanged)); // 定义一个附加事件 public static readonly RoutedEvent ContentChangedEvent = EventManager.RegisterRoutedEvent( "ContentChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(LabelContentChangedBehavior)); // 添加和移除事件的附加方法 public static void AddContentChangedHandler(DependencyObject d, RoutedEventHandler handler) { if (d is UIElement uiElement) { uiElement.AddHandler(ContentChangedEvent, handler); } } public static void RemoveContentChangedHandler(DependencyObject d, RoutedEventHandler handler) { if (d is UIElement uiElement) { uiElement.RemoveHandler(ContentChangedEvent, handler); } } public static bool GetEnableContentChanged(DependencyObject obj) { return (bool)obj.GetValue(EnableContentChangedProperty); } public static void SetEnableContentChanged(DependencyObject obj, bool value) { obj.SetValue(EnableContentChangedProperty, value); } private static void OnEnableContentChangedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is Label label) { if ((bool)e.NewValue) { DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty( Label.ContentProperty, typeof(Label)); if (dpd != null) { dpd.AddValueChanged(label, OnLabelContentChanged); } } else { DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty( Label.ContentProperty, typeof(Label)); if (dpd != null) { dpd.RemoveValueChanged(label, OnLabelContentChanged); } } } } private static void OnLabelContentChanged(object sender, EventArgs e) { if (sender is Label label) { var newContent = label.Content?.ToString(); // 创建一个新的 RoutedEventArgs,并设置源为当前 Label RoutedEventArgs args = new RoutedEventArgs(ContentChangedEvent, label); label.RaiseEvent(args); } } }