代码之家  ›  专栏  ›  技术社区  ›  toxvaerd

在XAML中创建自定义填充画笔

  •  1
  • toxvaerd  · 技术社区  · 15 年前

    如何在XAML中创建以下形状?

    alt text http://mtx.dk/ellipse.png

    <Ellipse Height="100" Width="100">
        <Ellipse.Fill>
           ???
        </Ellipse.Fill>
    </Ellipse>
    

    LinearGradientBrush不能这样转换? RadialGradientBrush也不适用。

    有什么想法吗?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Nir    15 年前

    你不能用椭圆和内置的画笔来完成这项工作,但你自己也不难写出这样的形状。

    可以绘制许多“饼图切片”形状,并对每个切片应用不同的线性渐变画笔。

    这将使您开始:

    class GradiantEllipse : FrameworkElement
    {
        private const double N = 100;
    
        protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
        {
            var radius = Math.Min(ActualWidth/2,ActualHeight/2);
            var center = new Point(ActualWidth/2,ActualHeight/2);
            for (int i = 0; i < N; ++i)
            {
                var startAngle = (Math.PI*2/N)*i;
                var endAngle = (Math.PI*2/N)*(i+1)+2*(Math.PI/radius)+1/(2*Math.PI+radius); // + 1px to avoid gap
                var start = new Point(Math.Cos(startAngle)*radius+center.X,
                    Math.Sin(startAngle)*radius+center.Y);
                var end = new Point(Math.Cos(endAngle)*radius+center.X,
                    Math.Sin(endAngle)*radius+center.Y);
                var figure = new PathFigure();
                figure.StartPoint = center;
                figure.Segments.Add(new LineSegment(start,false));
                figure.Segments.Add(new LineSegment(end,false));
                figure.IsClosed = true;
                var geo = new PathGeometry();
                geo.Figures.Add(figure);
    
                var gradiant = new LinearGradientBrush(
                    Color.FromArgb(255, (byte)((255.0 / N) * i), (byte)((255.0 / N) * i), (byte)((255.0 / N) * i)),
                    Color.FromArgb(255, (byte)((255.0 / N) * (i + 1)), (byte)((255.0 / N) * (i + 1)), (byte)((255.0 / N) * (i + 1))),
                    Math.Atan2(end.Y - start.Y, end.X - start.X) * 180 / Math.PI);
    
                drawingContext.DrawGeometry(gradiant, null, geo);
            }
        }
    }
    
        2
  •  1
  •   Aviad P.    15 年前

    你最好的办法是创建一个 DrawingBrush 使用一些自定义的绘图说明,可以将椭圆分成四分之一,并用不同的 RadialGradientBrush .