/// <summary>
        /// This is a complete replacement for base.OnPaintBackground(e) within method protected override void OnPaintBackground(PaintEventArgs e).
        /// This supports gradient backgrounds with optional background image overlays.
        /// The original only supported solid backgrounds with optional background image overlays.
        /// </summary>
        /// <param name="control">The control that needs its background painted.</param>
        /// <param name="e">Paint event args</param>
        /// <param name="gradientBrush">Gradient brush object.</param>
        internal static void PaintBackground(IGradientControl gradientControl, PaintEventArgs e)
        {
            GradientBrush gradientBrush = gradientControl.BackgroundGradient;
            Control       control       = (Control)gradientControl;

            Rectangle paintRect = control.ClientRectangle;

            if (control is GradientGroupBox)
            {
                const int borderWidth = 1;
                int       offset      = control.Font.Height / 2;
                paintRect.X      += borderWidth;
                paintRect.Width  -= (borderWidth * 2);
                paintRect.Y      += offset + 1;
                paintRect.Height -= (offset + borderWidth * 2) + 1;
                PaintTransparentBackground(control, e, control.ClientRectangle);
            }
            else if (RenderColorTransparent(control, gradientBrush.Color1) ||
                     RenderColorTransparent(control, gradientBrush.Color2))
            {
                PaintTransparentBackground(control, e, control.ClientRectangle);
            }

            int num;

            switch (control)
            {
            case Form _:
                //case MdiClient _:
                num = control.IsMirrored ? 1 : 0;
                break;

            default:
                num = 0;
                break;
            }
            bool flag = num != 0;

            if (control.BackgroundImage != null && !DisplayInformation_HighContrast && !flag)
            {
                if (control.BackgroundImageLayout == ImageLayout.Tile && ControlPaint_IsImageTransparent(control.BackgroundImage))
                {
                    PaintTransparentBackground(control, e, control.ClientRectangle);
                }

                var scrollOffset1 = control is ScrollableControl && ((ScrollableControl)control).AutoScroll ? ((ScrollableControl)control).AutoScrollPosition : Point.Empty;

                if (ControlPaint_IsImageTransparent(control.BackgroundImage))
                {
                    PaintBackColor(e, paintRect, gradientBrush);
                }
                ControlPaint_DrawBackgroundImage(e.Graphics, control.BackgroundImage, control.BackColor, control.BackgroundImageLayout, control.ClientRectangle, e.ClipRectangle, scrollOffset1, control.RightToLeft);
            }
            else
            {
                PaintBackColor(e, paintRect, gradientBrush);
            }
        }
        public GradientDrawable(IGradientControl control)
        {
            _control = control;

            MaskDrawable = new MaskDrawable <DrawContext>(
                new EllipseMaskPainter(),
                new RectangleMaskPainter(),
                new TextMaskPainter(),
                new PathMaskPainter());
        }
 public GradientDrawable(IGradientControl control)
 {
     _control       = control;
     _linearPainter = new LinearGradientPainter();
     _radialPainter = new RadialGradientPainter();
     _maskDrawable  = new MaskDrawable <DrawContext>(
         new EllipseMaskPainter(),
         new RectangleMaskPainter(),
         new TextMaskPainter(),
         new PathMaskPainter());
 }
Beispiel #4
0
        public static void SetBindingContext(this IGradientControl control, object bindingContext)
        {
            if (control.GradientSource is BindableObject bindable)
            {
                BindableObject.SetInheritedBindingContext(bindable, bindingContext);
            }

            if (control.Mask is BindableObject maskBindable)
            {
                BindableObject.SetInheritedBindingContext(maskBindable, bindingContext);
            }
        }
        public void ReadAttributes(IGradientControl view, Context context, IAttributeSet attrs)
        {
            var typedArray = context.ObtainStyledAttributes(attrs, Resource.Styleable.GradientView);

            try
            {
                ReadGradient(view, typedArray);

                if (typedArray.HasValue(Resource.Styleable.GradientView_maskShape))
                {
                    ReadMask(view, typedArray);
                }
            }
            finally
            {
                typedArray.Recycle();
            }
        }
        private void ReadGradient(IGradientControl view, TypedArray typedArray)
        {
            var source = typedArray.GetString(Resource.Styleable.GradientView_gradientSource);

            if (source != null)
            {
                var converter = new CssGradientSourceTypeConverter();
                view.GradientSource = (IGradientSource)converter.ConvertFromInvariantString(source);
            }

            var size = typedArray.GetString(Resource.Styleable.GradientView_gradientSize);

            if (size != null)
            {
                var converter = new DimensionsTypeConverter();
                view.GradientSize = (Dimensions)converter.ConvertFromInvariantString(size);
            }

            var repeat = typedArray.GetInt(Resource.Styleable.GradientView_gradientRepeat, 0);

            view.GradientRepeat = (BackgroundRepeat)repeat;
        }
        private void ReadMask(IGradientControl view, TypedArray typedArray)
        {
            var          maskShape = (MaskShape)typedArray.GetInt(Resource.Styleable.GradientView_maskShape, 0);
            GradientMask mask      = maskShape switch
            {
                MaskShape.Rectangle => new RectangleMask
                {
                    Size    = GetSize(typedArray),
                    Corners = GetCorners(typedArray)
                },
                MaskShape.Ellipse => new EllipseMask {
                    Size = GetSize(typedArray)
                },
                MaskShape.Path => new PathMask(typedArray.GetString(Resource.Styleable.GradientView_maskData)),
                _ => null
            };

            if (mask != null)
            {
                mask.Stretch = (Stretch)typedArray.GetInt(Resource.Styleable.GradientView_maskStretch, 0);
                view.Mask    = mask;
            }
        }
 public static void BuildFor(this GradientBuilder builder, IGradientControl control)
 {
     control.GradientSource = builder.BuildSource();
 }