2013-04-23 8 views
6

Biorąc pod uwagę LinearGradientBrush zdefiniowane następująco:Jak odczytać kolor z offsetu XAML LinearGradientBrush?

 <LinearGradientBrush x:Key="RedYellowGradient"> 
      <GradientStop Color="Blue" Offset="0.01" /> 
      <GradientStop Color="Purple" Offset="0.25"/> 
      <GradientStop Color="Red" Offset="0.5"/> 
      <GradientStop Color="Orange" Offset="0.75"/> 
      <GradientStop Color="Yellow" Offset="1.0"/> 
     </LinearGradientBrush> 

Co jest wymagane do podjęcia tej definicji i określenia koloru reprezentowanego przez specyficzny offsetowego, takie jak 0,13 lub 0,82, bez uczynienia czegokolwiek widoczne?

byłoby to przybrać formę funkcji z prototypem coś takiego:

Function GetColorFromBrushOffset(br as LinearGradientBrush, offset as Single) as SomeColorDataStructure 

Co musiałoby iść w ciele funkcji? Nie szukam skończonego kodu (choć nie odmówię!) Tylko kilka pomysłów na temat struktur danych i wywołań systemowych.

+0

tylko dostęp do Gradientstops i interpolacji między poszczególnymi parami ([0] -> [1], [1] - > [2] itp.) Przesunięcie, teraz użyj interpolowanej wartości do interpolacji między kolorami poszczególnych par. – dowhilefor

+0

[this] (http://stackoverflow.com/a/9651053/1069200) może być pomocny, możliwy duplikat –

+0

@JohanLarsson Masz rację; kod w jednej z odpowiedzi wygląda poprawnie dla moich celów. Wolę odtworzyć to tutaj, niż zaznaczyć ten duplikat, ponieważ nie mogłem znaleźć tego pytania w moich wyszukiwaniach, a jego pytanie ma inny zakres. –

Odpowiedz

6

Ta klasa (od one of this question's answers przez @JonnyPiazzi) wydaje się dokładnie zająć moje pytanie:

public static class GradientStopCollectionExtensions 
{ 
    public static Color GetRelativeColor(this GradientStopCollection gsc, double offset) 
    { 
     GradientStop before = gsc.Where(w => w.Offset == gsc.Min(m => m.Offset)).First(); 
     GradientStop after = gsc.Where(w => w.Offset == gsc.Max(m => m.Offset)).First(); 

     foreach (var gs in gsc) 
     { 
      if (gs.Offset < offset && gs.Offset > before.Offset) 
      { 
       before = gs; 
      } 
      if (gs.Offset > offset && gs.Offset < after.Offset) 
      { 
       after = gs; 
      } 
     } 

     var color = new Color(); 

     color.ScA = (float)((offset - before.Offset) * (after.Color.ScA - before.Color.ScA)/(after.Offset - before.Offset) + before.Color.ScA); 
     color.ScR = (float)((offset - before.Offset) * (after.Color.ScR - before.Color.ScR)/(after.Offset - before.Offset) + before.Color.ScR); 
     color.ScG = (float)((offset - before.Offset) * (after.Color.ScG - before.Color.ScG)/(after.Offset - before.Offset) + before.Color.ScG); 
     color.ScB = (float)((offset - before.Offset) * (after.Color.ScB - before.Color.ScB)/(after.Offset - before.Offset) + before.Color.ScB); 

     return color; 
    } 
}