1using Microsoft.Xaml.Behaviors.Layout;
3using System.ComponentModel;
5using System.Windows.Controls;
6using System.Windows.Data;
7using System.Windows.Documents;
8using System.Windows.Media;
9using System.Windows.Media.Animation;
32 new[] { (
"#FF1FD36B", 0.00), (
"#FFA7F0C1", 0.60), (
"#00FFFFFF", 1.00) }, 0.6, 0.6));
42 new[] { (
"#FF6E6E6E", 0.00), (
"#FF4B4B4B", 1.00) }, 0.65, 0.65));
52 private static readonly Brush
_offOuter = Brushes.Transparent;
61 private static readonly Brush
_offInner = Brushes.Transparent;
111 private static RadialGradientBrush
CreateRadial((
string color,
double offset)[] stops,
double rx,
double ry)
113 var b =
new RadialGradientBrush
115 Center =
new Point(0.5, 0.5),
116 GradientOrigin =
new Point(0.5, 0.5),
120 foreach (var (c, off) in stops)
121 b.GradientStops.Add(
new GradientStop((Color)ColorConverter.ConvertFromString(c), off));
122 if (b.CanFreeze) b.Freeze();
149 private static Brush
Freeze(Brush b) {
if (b.CanFreeze) b.Freeze();
return b; }
161 DefaultStyleKeyProperty.OverrideMetadata(
168 IsHitTestVisibleProperty.OverrideMetadata(
170 new FrameworkPropertyMetadata(
false));
173 FocusableProperty.OverrideMetadata(
175 new FrameworkPropertyMetadata(
false));
176 IsTabStopProperty.OverrideMetadata(
178 new FrameworkPropertyMetadata(
false));
180 var uri =
new Uri(
"/Dreamine.UI.Wpf.Themes;component/DreamineCheckLedStyle.xaml",
181 UriKind.RelativeOrAbsolute);
182 var app = Application.Current;
185 bool alreadyAdded = app.Resources.MergedDictionaries
186 .OfType<ResourceDictionary>()
187 .Any(x => x.Source !=
null && x.Source.Equals(uri));
191 var dict =
new ResourceDictionary { Source = uri };
192 app.Resources.MergedDictionaries.Add(dict);
255 if (led.IsOn && led.IsPulse)
257 var pulse =
new DoubleAnimation
261 Duration = TimeSpan.FromSeconds(0.4),
263 RepeatBehavior = RepeatBehavior.Forever
265 led.BeginAnimation(OpacityProperty, pulse);
269 led.BeginAnimation(OpacityProperty,
null);
284 new PropertyMetadata(LedCorner.TopRight));
296 new PropertyMetadata(18.0));
308 new PropertyMetadata(6.0));
320 new PropertyMetadata(0.45));
377 new PropertyMetadata(Brushes.White));
388 new PropertyMetadata(1.2));
512 #region Public Attached DPs
1440 #region Private state
1450 DependencyProperty.RegisterAttached(
"AdornerContainer", typeof(AdornerContainer), typeof(
DreamineCheckLedAttach),
1451 new PropertyMetadata(
null));
1531 if (d is not FrameworkElement fe)
return;
1533 if (DesignerProperties.GetIsInDesignMode(fe))
1576 private static void OnLoaded(
object? s, RoutedEventArgs e)
1662 var layer = AdornerLayer.GetAdornerLayer(fe);
1663 if (layer is
null)
return;
1666 if (container is
null)
1670 BindingOperations.SetBinding(led, FrameworkElement.WidthProperty,
new Binding(
"ActualWidth") { Source = fe });
1671 BindingOperations.SetBinding(led, FrameworkElement.HeightProperty,
new Binding(
"ActualHeight") { Source = fe });
1686 container =
new AdornerContainer(fe) { Child = led, IsHitTestVisible =
false };
1687 layer.Add(container);
1710 var layer = AdornerLayer.GetAdornerLayer(fe);
1712 if (container !=
null && layer !=
null)
1714 layer.Remove(container);
1767 private static void Bind(DependencyObject target, DependencyProperty targetDp,
1768 DependencyObject source, DependencyProperty attachedDp)
1770 var path =
new PropertyPath(
"(0)", attachedDp);
1771 BindingOperations.SetBinding(target, targetDp,
new Binding { Source = source, Path = path });
static readonly Brush _offInner
static readonly DependencyProperty CornerProperty
static readonly Brush _onInner
static Brush Freeze(Brush b)
static readonly DependencyProperty InnerScaleProperty
static readonly DependencyProperty OffInnerFillProperty
static readonly Brush _onOuter
static readonly DependencyProperty OffOuterFillProperty
static readonly DependencyProperty OnOuterFillProperty
static readonly DependencyProperty IsOnProperty
static readonly DependencyProperty StrokeThicknessProperty
static readonly DependencyProperty IsPulseProperty
static DreamineCheckLed()
static readonly DependencyProperty EdgeOffsetProperty
static readonly Brush _offOuter
static readonly DependencyProperty StrokeBrushProperty
static void OnPulseStateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
static readonly DependencyProperty OnInnerFillProperty
static readonly DependencyProperty DiameterProperty
static RadialGradientBrush CreateRadial((string color, double offset)[] stops, double rx, double ry)
static readonly DependencyProperty InnerScaleProperty
static void SetIsOn(DependencyObject o, bool v)
static void SetCorner(DependencyObject o, LedCorner v)
static readonly DependencyProperty OffInnerFillProperty
static readonly DependencyProperty IsPulseProperty
static double GetInnerScale(DependencyObject o)
static readonly DependencyProperty DiameterProperty
static Brush GetStrokeBrush(DependencyObject o)
static void EnsureAdorner(FrameworkElement fe)
static void SetOffOuterFill(DependencyObject o, Brush v)
static void SetStrokeBrush(DependencyObject o, Brush v)
static void OnUnloaded(object? s, RoutedEventArgs e)
static readonly DependencyProperty IsEnabledProperty
static void OnLoaded(object? s, RoutedEventArgs e)
static readonly DependencyProperty StrokeBrushProperty
static bool GetIsOn(DependencyObject o)
static readonly DependencyProperty StrokeThicknessProperty
static void SetAdornerContainer(DependencyObject o, AdornerContainer? v)
static bool GetIsEnabled(DependencyObject o)
static void SetOnOuterFill(DependencyObject o, Brush v)
static void SetMargin(DependencyObject o, double v)
static void SetDiameter(DependencyObject o, double v)
static readonly DependencyProperty IsOnProperty
static readonly DependencyProperty MarginProperty
static ? AdornerContainer GetAdornerContainer(DependencyObject o)
static double GetDiameter(DependencyObject o)
static Brush GetOnInnerFill(DependencyObject o)
static readonly DependencyProperty OffOuterFillProperty
static double GetStrokeThickness(DependencyObject o)
static Brush GetOffOuterFill(DependencyObject o)
static bool GetIsPulse(DependencyObject o)
static double GetMargin(DependencyObject o)
static readonly DependencyProperty CornerProperty
static void SetStrokeThickness(DependencyObject o, double v)
static void SetIsEnabled(DependencyObject o, bool v)
static readonly DependencyProperty AdornerContainerProperty
static void SetInnerScale(DependencyObject o, double v)
static void Bind(DependencyObject target, DependencyProperty targetDp, DependencyObject source, DependencyProperty attachedDp)
static Brush GetOnOuterFill(DependencyObject o)
static void RemoveAdorner(FrameworkElement fe)
static readonly DependencyProperty OnOuterFillProperty
static void SetOnInnerFill(DependencyObject o, Brush v)
static void OnSizeChanged(object? s, SizeChangedEventArgs e)
static Brush GetOffInnerFill(DependencyObject o)
static readonly DependencyProperty OnInnerFillProperty
static void OnAnyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
static void SetIsPulse(DependencyObject o, bool v)
static LedCorner GetCorner(DependencyObject o)
static void SetOffInnerFill(DependencyObject o, Brush v)