wpf ListView圆角

网上找了 好久 没找到好的

自己实现了3种

1.用clip属性

2。用装饰器Adorner

3.修改模板

 

1。clip 就是画一个圆角矩形

但是这个在listview  size 变化时 也要调用这个方法

代码如下:

 1 using System;
 2 using System.Windows;
 3 using System.Windows.Media;
 4 
 5     class ClipRadiusView
 6     {
 7         private static double DisX = 20;
 8         private static double DisY = 20;
 9         static Size XY=new Size(DisX,DisY);
10         
11         private static bool isLarge = false;
12         private static bool isStroke = true;
13         private static double angle = 150;
14 
15         private static int offx = 3;
16         private static int offy = 2;
17 
18         static Point StartPoint = new Point(offx, DisY);
19         static Point P1 = new Point(DisX, offy);
20         
21 
22         public static void InitClip(FrameworkElement el)
23         {
24             double w = el.ActualWidth;
25             double h = el.ActualHeight;
26             if(w<DisX*2||h<DisY*2)
27                 return;
28 
29             
30             PathFigure myFigure=new PathFigure();
31 
32            
33             
34             myFigure.StartPoint = StartPoint;
35 
36             ArcSegment a1=new ArcSegment(P1, XY, angle,isLarge,SweepDirection.Clockwise, isStroke);
37             myFigure.Segments.Add(a1);
38 
39             Point p2 = new Point(w - DisX, offy);
40             LineSegment l1 = new LineSegment(p2, true);
41             myFigure.Segments.Add(l1);
42 
43             Point p3 = new Point(w, DisY);
44             ArcSegment a2 = new ArcSegment(p3, XY, angle, isLarge, SweepDirection.Clockwise, isStroke);
45             myFigure.Segments.Add(a2);
46 
47             Point p4 = new Point(w, h - DisY);
48             LineSegment l2 = new LineSegment(p4, true);
49             myFigure.Segments.Add(l2);
50 
51             Point p5 = new Point(w - DisX, h);
52             ArcSegment a3 = new ArcSegment(p5, XY, angle, isLarge, SweepDirection.Clockwise, isStroke);
53             myFigure.Segments.Add(a3);
54 
55             Point p6 = new Point(DisX, h);
56             LineSegment l3 = new LineSegment(p6, true);
57             myFigure.Segments.Add(l3);
58 
59             Point p7 = new Point(offx, h - DisY);
60             ArcSegment a4 = new ArcSegment(p7, XY, angle, isLarge, SweepDirection.Clockwise, isStroke);
61             myFigure.Segments.Add(a4);
62 
63             //Point p8 = new Point(offx, DisY);
64             //LineSegment l4 = new LineSegment(p8, true);
65             //myFigure.Segments.Add(l4);
66 
67             myFigure.IsClosed = true;
68             PathGeometry pg = new PathGeometry();
69             pg.Figures.Add(myFigure);
70             el.ClipToBounds = true;
71             el.Clip = pg;
72         }
73     }

2.装饰器Adorner

就是再四个角落画一个和背景色一样的圆角

这个 会随着尺寸变化而变化

using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;

    class RadiusAdorner : Adorner
    {
        private Brush _backBrush = Brushes.White;
        private Pen renderPen;
        public RadiusAdorner(UIElement el, Brush pen)
            : base(el)
        {
            if (pen != null)
                _backBrush = pen;
            renderPen = new Pen(_backBrush, 0);
        }

        private static double DisX = 20;
        private static double DisY = 20;
        Size XY = new Size(DisX, DisY);
        private bool isLarge = false;
        private bool isStroke = true;
        private double angle = 90;
        private double penSize = 2;



        private Point _start;
        private PathGeometry _pg;
        private PathFigure _pf;
        private Point _start1;
        private Point _p1;
        private Point _p2;
        private LineSegment _line;
        private ArcSegment _arc;
        private Rect _adornedElementRect;

        protected override void OnRender(DrawingContext drawingContext)
        {
            _adornedElementRect = new Rect(this.AdornedElement.RenderSize);
            double w = _adornedElementRect.Width;
            double h = _adornedElementRect.Height;

            _start = new Point(_adornedElementRect.X, _adornedElementRect.Y);
            _pg = new PathGeometry();


            _pf = new PathFigure();

            //左上角
            _start1 = _start;
            _pf = new PathFigure();
            _pf.StartPoint = _start1;

            _p1 = new Point(_start1.X + DisX, _start1.Y);
            _line = new LineSegment(_p1, true);
            _pf.Segments.Add(_line);

            _p2 = new Point(_start1.X, _start1.Y + DisY);
            _arc = new ArcSegment(_p2, XY, angle, isLarge, SweepDirection.Counterclockwise, isStroke);
            _pf.Segments.Add(_arc);

            _pf.IsClosed = true;
            _pg.Figures.Add(_pf);

            顶部画一条线 
            //_start1 = new Point(_start.X, _start.Y + 2); ;
            //_pf=new PathFigure();
            //_pf.StartPoint = _start1;

            //_p1=new Point(_start1.X+w,_start1.Y);
            //_line=new LineSegment(_p1,true);
            //_pf.Segments.Add(_line);
            //_pg.Figures.Add(_pf);

            //右上角
            _start1 = new Point(_start.X + w, _start.Y);
            _pf = new PathFigure();
            _pf.StartPoint = _start1;

            _p1 = new Point(_start1.X - DisX, _start1.Y);
            _line = new LineSegment(_p1, true);
            _pf.Segments.Add(_line);

            _p2 = new Point(_start1.X, _start1.Y + DisY);
            _arc = new ArcSegment(_p2, XY, angle, isLarge, SweepDirection.Clockwise, isStroke);
            _pf.Segments.Add(_arc);

            _pf.IsClosed = true;
            _pg.Figures.Add(_pf);


            //右下角
            _start1 = new Point(_start.X + w, _start.Y + h);
            _pf = new PathFigure();
            _pf.StartPoint = _start1;

            _p1 = new Point(_start1.X - DisX, _start1.Y);
            _line = new LineSegment(_p1, true);
            _pf.Segments.Add(_line);

            _p2 = new Point(_start1.X, _start1.Y - DisY);
            _arc = new ArcSegment(_p2, XY, angle, isLarge, SweepDirection.Counterclockwise, isStroke);
            _pf.Segments.Add(_arc);

            _pf.IsClosed = true;
            _pg.Figures.Add(_pf);

            //左下角
            _start1 = new Point(_start.X, _start.Y + h);
            _pf = new PathFigure();
            _pf.StartPoint = _start1;

            _p1 = new Point(_start1.X + DisX, _start1.Y);
            _line = new LineSegment(_p1, true);
            _pf.Segments.Add(_line);

            _p2 = new Point(_start1.X, _start1.Y - DisY);
            _arc = new ArcSegment(_p2, XY, angle, isLarge, SweepDirection.Clockwise, isStroke);
            _pf.Segments.Add(_arc);

            _pf.IsClosed = true;
            _pg.Figures.Add(_pf);

            drawingContext.DrawGeometry(renderPen.Brush, renderPen, _pg);

        }


        static Brush defaulBrushe=new SolidColorBrush(new Color{A = 255,R=137,G=181,B=233});
        public static void AddRadiusAdorner(FrameworkElement el)
        {
            RadiusAdorner ra=new RadiusAdorner(el,defaulBrushe);

            AdornerLayer al = AdornerLayer.GetAdornerLayer(el);
            if (al != null)
            {
                al.Add(ra);
            }
        }
    }

  3 模板

     就是修改ListView的默认Template  参考msdn listview样式里的 改

     但是gridview的上面部分 不能切成圆角

转载于:https://www.cnblogs.com/wolfsky6/p/3835982.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值