internal static IDisposable AssignAndObserveBrush(Brush b, ColorSetterHandler colorSetter, Action imageBrushCallback = null) { var disposables = new CompositeDisposable(); if (b != null) { if (b is SolidColorBrush colorBrush) { colorSetter(colorBrush.ColorWithOpacity); colorBrush.RegisterDisposablePropertyChangedCallback( SolidColorBrush.ColorProperty, (s, colorArg) => colorSetter((s as SolidColorBrush).ColorWithOpacity) ) .DisposeWith(disposables); colorBrush.RegisterDisposablePropertyChangedCallback( SolidColorBrush.OpacityProperty, (s, colorArg) => colorSetter((s as SolidColorBrush).ColorWithOpacity) ) .DisposeWith(disposables); } //else if (b is ImageBrush imageBrush) //{ // Action<_Image> action = _ => colorSetter(SolidColorBrushHelper.Transparent.Color); // imageBrush.ImageChanged += action; // disposables.Add(() => imageBrush.ImageChanged -= action); //} else if (b is AcrylicBrush acrylicBrush) { colorSetter(acrylicBrush.FallbackColorWithOpacity); acrylicBrush.RegisterDisposablePropertyChangedCallback( AcrylicBrush.FallbackColorProperty, (s, args) => colorSetter((s as AcrylicBrush).FallbackColorWithOpacity)) .DisposeWith(disposables); acrylicBrush.RegisterDisposablePropertyChangedCallback( AcrylicBrush.OpacityProperty, (s, args) => colorSetter((s as AcrylicBrush).FallbackColorWithOpacity)) .DisposeWith(disposables); return(disposables); } else { colorSetter(SolidColorBrushHelper.Transparent.Color); } } else { colorSetter(SolidColorBrushHelper.Transparent.Color); } return(disposables); }
internal static IDisposable AssignAndObserveBrush(Brush b, ColorSetterHandler colorSetter, Action imageBrushCallback = null) { if (b is SolidColorBrush colorBrush) { var disposables = new CompositeDisposable(2); colorSetter(colorBrush.ColorWithOpacity); colorBrush.RegisterDisposablePropertyChangedCallback( SolidColorBrush.ColorProperty, (s, colorArg) => colorSetter((s as SolidColorBrush).ColorWithOpacity) ).DisposeWith(disposables); colorBrush.RegisterDisposablePropertyChangedCallback( SolidColorBrush.OpacityProperty, (s, colorArg) => colorSetter((s as SolidColorBrush).ColorWithOpacity) ).DisposeWith(disposables); return(disposables); } else if (b is GradientBrush gradientBrush) { var disposables = new CompositeDisposable(2); colorSetter(gradientBrush.FallbackColorWithOpacity); gradientBrush.RegisterDisposablePropertyChangedCallback( GradientBrush.FallbackColorProperty, (s, colorArg) => colorSetter((s as GradientBrush).FallbackColorWithOpacity) ).DisposeWith(disposables); gradientBrush.RegisterDisposablePropertyChangedCallback( GradientBrush.OpacityProperty, (s, colorArg) => colorSetter((s as GradientBrush).FallbackColorWithOpacity) ).DisposeWith(disposables); return(disposables); } else if (b is ImageBrush imageBrush && imageBrushCallback != null) { var disposables = new CompositeDisposable(5); imageBrush.RegisterDisposablePropertyChangedCallback( ImageBrush.ImageSourceProperty, (_, __) => imageBrushCallback() ).DisposeWith(disposables); imageBrush.RegisterDisposablePropertyChangedCallback( ImageBrush.StretchProperty, (_, __) => imageBrushCallback() ).DisposeWith(disposables); imageBrush.RegisterDisposablePropertyChangedCallback( ImageBrush.AlignmentXProperty, (_, __) => imageBrushCallback() ).DisposeWith(disposables); imageBrush.RegisterDisposablePropertyChangedCallback( ImageBrush.AlignmentYProperty, (_, __) => imageBrushCallback() ).DisposeWith(disposables); imageBrush.RegisterDisposablePropertyChangedCallback( ImageBrush.RelativeTransformProperty, (_, __) => imageBrushCallback() ).DisposeWith(disposables); return(disposables); }
internal static IDisposable AssignAndObserveBrush(Brush b, ColorSetterHandler colorSetter, Action imageBrushCallback = null) { if (b is SolidColorBrush colorBrush) { var disposables = new CompositeDisposable(2); colorSetter(colorBrush.ColorWithOpacity); colorBrush.RegisterDisposablePropertyChangedCallback( SolidColorBrush.ColorProperty, (s, colorArg) => colorSetter((s as SolidColorBrush).ColorWithOpacity) ) .DisposeWith(disposables); colorBrush.RegisterDisposablePropertyChangedCallback( OpacityProperty, (s, colorArg) => colorSetter((s as SolidColorBrush).ColorWithOpacity) ) .DisposeWith(disposables); return(disposables); } else if (b is GradientBrush gradientBrush) { var disposables = new CompositeDisposable(2); colorSetter(gradientBrush.FallbackColorWithOpacity); gradientBrush.RegisterDisposablePropertyChangedCallback( GradientBrush.FallbackColorProperty, (s, colorArg) => colorSetter((s as GradientBrush).FallbackColorWithOpacity) ).DisposeWith(disposables); gradientBrush.RegisterDisposablePropertyChangedCallback( GradientBrush.OpacityProperty, (s, colorArg) => colorSetter((s as GradientBrush).FallbackColorWithOpacity) ).DisposeWith(disposables); return(disposables); } else if (b is ImageBrush imageBrush) { var disposables = new CompositeDisposable(5); void ImageChanged(_Image _) => colorSetter(SolidColorBrushHelper.Transparent.Color); imageBrush.ImageChanged += ImageChanged; Disposable.Create(() => imageBrush.ImageChanged -= ImageChanged) .DisposeWith(disposables); imageBrush.RegisterDisposablePropertyChangedCallback( ImageBrush.StretchProperty, (_, __) => imageBrushCallback?.Invoke() ).DisposeWith(disposables); imageBrush.RegisterDisposablePropertyChangedCallback( ImageBrush.AlignmentXProperty, (_, __) => imageBrushCallback?.Invoke() ).DisposeWith(disposables); imageBrush.RegisterDisposablePropertyChangedCallback( ImageBrush.AlignmentYProperty, (_, __) => imageBrushCallback?.Invoke() ).DisposeWith(disposables); imageBrush.RegisterDisposablePropertyChangedCallback( ImageBrush.RelativeTransformProperty, (_, __) => imageBrushCallback?.Invoke() ).DisposeWith(disposables); return(disposables); } else if (b is AcrylicBrush acrylicBrush) { var disposables = new CompositeDisposable(2); colorSetter(acrylicBrush.FallbackColorWithOpacity); acrylicBrush.RegisterDisposablePropertyChangedCallback( AcrylicBrush.FallbackColorProperty, (s, args) => colorSetter((s as AcrylicBrush).FallbackColorWithOpacity)) .DisposeWith(disposables); acrylicBrush.RegisterDisposablePropertyChangedCallback( AcrylicBrush.OpacityProperty, (s, args) => colorSetter((s as AcrylicBrush).FallbackColorWithOpacity)) .DisposeWith(disposables); return(disposables); } else { colorSetter(SolidColorBrushHelper.Transparent.Color); } return(Disposable.Empty); }
internal static IDisposable AssignAndObserveBrush(Brush b, ColorSetterHandler colorSetter, Action imageBrushCallback = null) { if (b is SolidColorBrush colorBrush) { var disposables = new CompositeDisposable(2); colorSetter(colorBrush.ColorWithOpacity); colorBrush.RegisterDisposablePropertyChangedCallback( SolidColorBrush.ColorProperty, (s, colorArg) => colorSetter((s as SolidColorBrush).ColorWithOpacity) ) .DisposeWith(disposables); colorBrush.RegisterDisposablePropertyChangedCallback( SolidColorBrush.OpacityProperty, (s, colorArg) => colorSetter((s as SolidColorBrush).ColorWithOpacity) ) .DisposeWith(disposables); return(disposables); } if (b is GradientBrush gb) { var disposables = new CompositeDisposable(2); colorSetter(gb.FallbackColorWithOpacity); gb.RegisterDisposablePropertyChangedCallback( GradientBrush.FallbackColorProperty, (s, colorArg) => colorSetter((s as GradientBrush).FallbackColorWithOpacity) ) .DisposeWith(disposables); gb.RegisterDisposablePropertyChangedCallback( GradientBrush.OpacityProperty, (s, colorArg) => colorSetter((s as GradientBrush).FallbackColorWithOpacity) ) .DisposeWith(disposables); return(disposables); } if (b is AcrylicBrush ab) { Application.Current.RaiseRecoverableUnhandledException(new InvalidOperationException( "AcrylicBrush is ** not ** supported by the AssignAndObserveBrush. " + "(Instead you have to use the AcrylicBrush.Subscribe().)")); return(Disposable.Empty); } if (b is ImageBrush) { Application.Current.RaiseRecoverableUnhandledException(new InvalidOperationException( "ImageBrush is ** not ** supported by the AssignAndObserveBrush. " + "(Instead you have to use the ImageBrush.Subscribe().)")); return(Disposable.Empty); } colorSetter(SolidColorBrushHelper.Transparent.Color); return(Disposable.Empty); }
private static IDisposable ObserveGradientBrushStops(GradientStopCollection stops, ColorSetterHandler colorSetter) { var disposables = new CompositeDisposable(); if (stops != null) { colorSetter(Colors.Transparent); stops.VectorChanged += OnVectorChanged; disposables.Add(() => stops.VectorChanged -= OnVectorChanged); } return(disposables); void OnVectorChanged(IObservableVector <GradientStop> sender, IVectorChangedEventArgs e) { colorSetter(Colors.Transparent); foreach (var stop in stops.ToArray()) { WhenAnyChanged(disposables, stop, (s, e) => colorSetter(Colors.Transparent), new[] { GradientStop.ColorProperty, GradientStop.OffsetProperty, }); } } }
internal static IDisposable AssignAndObserveBrush(Brush b, ColorSetterHandler colorSetter, Action imageBrushCallback = null) { if (b is SolidColorBrush colorBrush) { colorSetter(colorBrush.ColorWithOpacity); return(WhenAnyChanged(new CompositeDisposable(2), colorBrush, (s, e) => colorSetter((s as SolidColorBrush).ColorWithOpacity), new[] { SolidColorBrush.ColorProperty, SolidColorBrush.OpacityProperty, })); } else if (b is GradientBrush gb) { var disposables = new CompositeDisposable(4); colorSetter(gb.FallbackColorWithOpacity); WhenAnyChanged(disposables, gb, (s, e) => colorSetter((s as GradientBrush).FallbackColorWithOpacity), new[] { GradientBrush.FallbackColorProperty, GradientBrush.OpacityProperty, }); var innerDisposable = new SerialDisposable(); innerDisposable.Disposable = ObserveGradientBrushStops(gb.GradientStops, colorSetter); gb .RegisterDisposablePropertyChangedCallback( GradientBrush.GradientStopsProperty, (s, e) => innerDisposable.Disposable = ObserveGradientBrushStops((s as GradientBrush).GradientStops, colorSetter) ) .DisposeWith(disposables); innerDisposable.DisposeWith(disposables); return(disposables); } else if (b is AcrylicBrush ab) { Application.Current.RaiseRecoverableUnhandledException(new InvalidOperationException( "AcrylicBrush is ** not ** supported by the AssignAndObserveBrush. " + "(Instead you have to use the AcrylicBrush.Subscribe().)")); return(Disposable.Empty); } else if (b is ImageBrush) { Application.Current.RaiseRecoverableUnhandledException(new InvalidOperationException( "ImageBrush is ** not ** supported by the AssignAndObserveBrush. " + "(Instead you have to use the ImageBrush.Subscribe().)")); return(Disposable.Empty); } else if (b is XamlCompositionBrushBase unsupportedCompositionBrush) { colorSetter(unsupportedCompositionBrush.FallbackColorWithOpacity); return(WhenAnyChanged(new CompositeDisposable(2), unsupportedCompositionBrush, (s, e) => colorSetter((s as XamlCompositionBrushBase).FallbackColorWithOpacity), new[] { XamlCompositionBrushBase.FallbackColorProperty, XamlCompositionBrushBase.OpacityProperty, })); } else { colorSetter(Colors.Transparent); return(Disposable.Empty); } }