2010-01-12 6 views

Répondre

3

Vous ne pouvez pas le faire avec une ellipse et les brosses intégrées, mais il n'est pas difficile d'écrire une telle forme vous-même.

Vous pouvez dessiner beaucoup de formes de "tranches de tarte" et appliquer une brosse de dégradé linéaire différente à chaque tranche.

Cela vous aider à démarrer:

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); 
     } 
    } 
} 
+0

Merci un bouquet. Je suppose que c'est le plus proche d'une "vraie" solution de graphisme vectoriel. – toxvaerd

1

Votre meilleur pari serait de créer un DrawingBrush avec quelques instructions de dessin personnalisé, diviser peut-être l'ellipse en quartiers et remplir chacun avec un autre RadialGradientBrush.