Создание собственной кисти заливки в XAML - PullRequest
1 голос
/ 12 января 2010

Как мне создать следующую фигуру в XAML?

альтернативный текст http://mtx.dk/ellipse.png

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

LinearGradientBrush не может быть преобразован таким образом? RadialGradientBrush также не подходит.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 12 января 2010

Вы не можете сделать это с помощью эллипса и встроенных кистей, но написать такую ​​форму не сложно.

Вы можете нарисовать много фигур "круговых срезов" и применить разные кисти линейного градиента к каждому срезу.

Это поможет вам начать:

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);
        }
    }
}
1 голос
/ 12 января 2010

Лучше всего было бы создать DrawingBrush с некоторыми пользовательскими инструкциями по рисованию, возможно, разделить эллипс на четверти и заполнить каждый из них RadialGradientBrush.

...