WPF 关于圆角的制作

1、使用Boder(一般情况):

设置CornerRadius属性

 <Border x:Name="border" CornerRadius="20">

...

</Border>

 

2、创建ClippingBorder类:

View Code
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows.Controls;

using System.Windows.Media;

using System.Windows;

 

namespace Shgbit.Controls {

    /// <Remarks>

    ///     As a side effect ClippingBorder will surpress any databinding or animation of 

    ///         its childs UIElement.Clip property until the child is removed from ClippingBorder

    /// </Remarks>

    public class ClippingBorder : Border {

        protected override void OnRender(DrawingContext dc) {

            OnApplyChildClip();

            base.OnRender(dc);

        }

 

        public override UIElement Child {

            get {

                return base.Child;

            }

            set {

                if (this.Child != value) {

                    if (this.Child != null) {

                        // Restore original clipping

                        this.Child.SetValue(UIElement.ClipProperty, _oldClip);

                    }

 

                    if (value != null) {

                        _oldClip = value.ReadLocalValue(UIElement.ClipProperty);

                    } else {

                        // If we dont set it to null we could leak a Geometry object

                        _oldClip = null;

                    }

 

                    base.Child = value;

                }

            }

        }

 

        protected virtual void OnApplyChildClip() {

            UIElement child = this.Child;

            if (child != null) {

                _clipRect.RadiusX = _clipRect.RadiusY = Math.Max(0.0, this.CornerRadius.TopLeft - (this.BorderThickness.Left * 0.5));

                Rect rect = new Rect(this.RenderSize);

                rect.Height -= (this.BorderThickness.Top + this.BorderThickness.Bottom);

                rect.Width -= (this.BorderThickness.Left + this.BorderThickness.Right);

                _clipRect.Rect = rect;

                child.Clip = _clipRect;

            }

        }

 

        public void Update() { OnApplyChildClip(); }

 

        private RectangleGeometry _clipRect = new RectangleGeometry();

        private object _oldClip;

    }

}

用法:
需应用xmlns:control="你的命名空间"

<control:ClippingBorder CornerRadius="20">

    <StackPanel Background="Yellow">

        <Label>Hello World</Label>

    </StackPanel>

</control:ClippingBorder>

 

3、使用Clip(通过路径):

<Border Width="300" Height="100">

    <Border.Clip>

        <PathGeometry>

            <PathGeometry.Figures>

                <PathFigure StartPoint="0,0" IsClosed="True">

                    <LineSegment Point="300,0" />

                    <LineSegment Point="300,80" />

                    <ArcSegment Point="280,100" Size="20,20" SweepDirection="Clockwise"/>

                    <LineSegment Point="0,100" />

                </PathFigure>

            </PathGeometry.Figures>

        </PathGeometry>

    </Border.Clip>

    <StackPanel Background="Yellow">

        <Label>Hello World</Label>

    </StackPanel>

</Border>

 

你可能感兴趣的:(WPF)