示例#1
0
        /// <summary>
        /// Registers observers for property changes on the specified Brush.
        /// Note that skia implementation of this method should only be used for property observervation.
        /// </summary>
        internal static IDisposable AssignAndObserveBrush(Brush brush, Action <Color> colorSetter, Action imageBrushCallback = null)
        {
            if (brush == null)
            {
                colorSetter(SolidColorBrushHelper.Transparent.Color);

                return(null);
            }

            var disposables = new CompositeDisposable();

            if (brush is SolidColorBrush colorBrush)
            {
                brush.RegisterDisposablePropertyChangedCallback(
                    SolidColorBrush.ColorProperty,
                    (s, colorArg) => colorSetter(SolidColorBrushHelper.Transparent.Color)
                    )
                .DisposeWith(disposables);

                brush.RegisterDisposablePropertyChangedCallback(
                    SolidColorBrush.OpacityProperty,
                    (s, colorArg) => colorSetter(SolidColorBrushHelper.Transparent.Color)
                    )
                .DisposeWith(disposables);
            }
            else if (brush is GradientBrush gradientBrush)
            {
                if (gradientBrush is LinearGradientBrush linearGradient)
                {
                    gradientBrush.RegisterDisposablePropertyChangedCallback(
                        LinearGradientBrush.StartPointProperty,
                        (s, e) => colorSetter(SolidColorBrushHelper.Transparent.Color)
                        )
                    .DisposeWith(disposables);

                    gradientBrush.RegisterDisposablePropertyChangedCallback(
                        LinearGradientBrush.EndPointProperty,
                        (s, e) => colorSetter(SolidColorBrushHelper.Transparent.Color)
                        )
                    .DisposeWith(disposables);
                }

                gradientBrush.RegisterDisposablePropertyChangedCallback(
                    GradientBrush.GradientStopsProperty,
                    (s, e) => colorSetter(SolidColorBrushHelper.Transparent.Color)
                    )
                .DisposeWith(disposables);

                gradientBrush.RegisterDisposablePropertyChangedCallback(
                    GradientBrush.MappingModeProperty,
                    (s, e) => colorSetter(SolidColorBrushHelper.Transparent.Color)
                    )
                .DisposeWith(disposables);

                gradientBrush.RegisterDisposablePropertyChangedCallback(
                    GradientBrush.OpacityProperty,
                    (s, e) => colorSetter(SolidColorBrushHelper.Transparent.Color)
                    )
                .DisposeWith(disposables);

                gradientBrush.RegisterDisposablePropertyChangedCallback(
                    GradientBrush.SpreadMethodProperty,
                    (s, e) => colorSetter(SolidColorBrushHelper.Transparent.Color)
                    )
                .DisposeWith(disposables);

                gradientBrush.RegisterDisposablePropertyChangedCallback(
                    GradientBrush.RelativeTransformProperty,
                    (s, e) => colorSetter(SolidColorBrushHelper.Transparent.Color)
                    )
                .DisposeWith(disposables);
            }
            //else if (b is ImageBrush imageBrush)
            //{
            //}
            else if (brush is AcrylicBrush acrylicBrush)
            {
                acrylicBrush.RegisterDisposablePropertyChangedCallback(
                    AcrylicBrush.FallbackColorProperty,
                    (s, e) => colorSetter(SolidColorBrushHelper.Transparent.Color)
                    )
                .DisposeWith(disposables);

                acrylicBrush.RegisterDisposablePropertyChangedCallback(
                    AcrylicBrush.OpacityProperty,
                    (s, e) => colorSetter(SolidColorBrushHelper.Transparent.Color)
                    )
                .DisposeWith(disposables);
            }

            colorSetter(SolidColorBrushHelper.Transparent.Color);

            return(disposables);
        }