示例#1
0
        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);
        }
示例#2
0
        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);
            }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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,
                    });
                }
            }
        }
示例#6
0
        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);
            }
        }