2013-04-23 89 views
6

給出定義的LinearGradientBrush如下:如何從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> 

什麼是需要採取的定義,並確定由特定的一個偏移表示的顏色,如0.13或0.82勿使任何可見?

這將需要一個函數的形式與原型是這樣的:

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

什麼需要在函數體中去嗎?我不是在尋找完成的代碼(儘管我不會拒絕它!)只是關於使用什麼數據結構和系統調用的一些想法。

+0

只需訪問Gradientstops,並且每個對之間進行內插([0] - > [1],[1] - > [2]等)偏移量,現在使用內插值在每對顏色之間插值。 – dowhilefor 2013-04-23 09:03:17

+0

[this](http://stackoverflow.com/a/9651053/1069200)可能會有幫助,可能重複 – 2013-04-23 10:29:13

+0

@JohanLarsson你是對的;其中一個答案中的代碼看起來對我而言是正確的。我寧願在這裏重現它,因爲我無法從我的搜索中找到這個問題,並且他的問題在範圍上有所不同。 – 2013-04-23 18:14:12

回答

6

這個類(從one of this question's answers由@JonnyPiazzi)出現準確尋址我的問題:

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; 
    } 
} 
相關問題