2012-01-01 5 views
1

私はかなり経験豊かな.NETデスクトップ開発者ですが、私はSilverlightを初めて使用しています。私は、iOSアプリケーションをSilverlightアプリケーションに変換しようとしています。ボーダーでSilverlightの動的背景(グラデーションを使用)

このアプリは基本的に、データベースから取得したデータを使用して構築されたアイテムのリストです。このデータには、多数のラベルテキストと、前景色と背景色の情報が含まれています。各オブジェクトは独自のユーザーコントロールです。内部にグリッドを持つBorderコントロール(背景色付けと丸みを帯びたエッジ用)で構成されています。私のラベルコントロール(TextBlocks)はすべてGridの内側にあります。

これらの色の値(フォアグラウンドとバックグラウンド)は、それぞれカンマ区切りの文字列(「{r}、{g}、{b}」)としてデータベースから出力されます。

したがって、これらの値をコード内の実際のカラーオブジェクトに変換します。次に、ラベルの前景色をこの色に設定します。

このすべて(ラベルテキストの割り当てと前景色)は非常にうまく機能しています。動作しないのは、背景色を線形のグラデーションブラシに変換することです。私は現在、データベースの色を「基本」色として使用しており、この色から4色の勾配を計算しています。 (数字は重要ではありませんが、RGB値をベースカラーの1.4,1.2,0.8、および0.6に調整します)。

ここでカスタムの線形グラデーションブラシを作成するコードです:

Friend Function CalculateColorsFromBaseColor(ByVal baseColor As Color) As List(Of Color) 
    Dim retList As New List(Of Color) 
    Dim r As Byte = baseColor.R 
    Dim g As Byte = baseColor.G 
    Dim b As Byte = baseColor.B 
    retList.Add(New Color With {.R = If(r * 1.4 > 255, 255, r * 1.4), .G = If(g * 1.4 > 255, 255, g * 1.4), .B = If(b * 1.4 > 255, 255, b * 1.4)}) 
    retList.Add(New Color With {.R = If(r * 1.2 > 255, 255, r * 1.2), .G = If(g * 1.2 > 255, 255, g * 1.2), .B = If(b * 1.2 > 255, 255, b * 1.2)}) 
    retList.Add(New Color With {.R = If(r * 0.8 > 255, 255, r * 0.8), .G = If(g * 0.8 > 255, 255, g * 0.8), .B = If(b * 0.8 > 255, 255, b * 0.8)}) 
    retList.Add(New Color With {.R = If(r * 0.6 > 255, 255, r * 0.6), .G = If(g * 0.6 > 255, 255, g * 0.6), .B = If(b * 0.6 > 255, 255, b * 0.6)}) 
    Return retList 
End Function 

Friend Function CalculateLinearGradientBrushFromBaseColor(ByVal baseColor As Color) As LinearGradientBrush 
    Dim lgb As New LinearGradientBrush With {.StartPoint = New Point(0.5, 0), .EndPoint = New Point(0.5, 1)} 
    Dim colors As List(Of Color) = CalculateColorsFromBaseColor(baseColor) 
    lgb.GradientStops.Add(New GradientStop With {.Color = colors.Item(0), .Offset = 0.0}) 
    lgb.GradientStops.Add(New GradientStop With {.Color = colors.Item(1), .Offset = 0.5}) 
    lgb.GradientStops.Add(New GradientStop With {.Color = colors.Item(2), .Offset = 0.5}) 
    lgb.GradientStops.Add(New GradientStop With {.Color = colors.Item(3), .Offset = 1.0}) 
    Return lgb 
End Function 

は、ここで私は、実行時にこれを組み込むしようとしている方法のためのコードです:

Dim backColorString As String = iCase.CaseColor 
Dim backColorRGB As String() = backColorString.Split(",") 
Dim backColor As Color = Color.FromArgb(255, CInt(backColorRGB(0)), CInt(backColorRGB(1)), CInt(backColorRGB(2))) 
caseCell.BackgroundBorder.Background = caseCell.CalculateLinearGradientBrushFromBaseColor(backColor) 

私は背景のグラデーションを設定すると、 XAMLでデザイン時に手動で、正しく表示されます。コードビハインドからそれをやろうとすると、私は全く背景がないようです。 (全体のページの背景が白い場合、私のユーザーコントロールの色も黒ですが、黒色なので、ユーザーコントロールの背景が透明になります)。

これをデバッグしようとすると、私のバックグラウンドの割り当てを中心に次のコードを追加しました」VEの:

'' Trying to see what the background values are prior to setting it 
For Each iStop As GradientStop In CType(caseCell.BackgroundBorder.Background, LinearGradientBrush).GradientStops 
    MessageBox.Show(String.Format("iStop Color: ({0},{1},{2})", iStop.Color.R, iStop.Color.G, iStop.Color.B)) 
Next 
'' Setting the background 
caseCell.BackgroundBorder.Background = caseCell.CalculateLinearGradientBrushFromBaseColor(backColor) 
'' Checking the values after setting 
For Each iStop As GradientStop In CType(caseCell.BackgroundBorder.Background, LinearGradientBrush).GradientStops 
    MessageBox.Show(String.Format("iStop Color: ({0},{1},{2})", iStop.Color.R, iStop.Color.G, iStop.Color.B)) 
Next 

メッセージボックスの結果のすべては予想通りですが、それでも、私は背景のグラデーションを取得していません。誰が何が起こっているか考えている?

ありがとうございます!

答えて

1

STUPID、STUPID、STUPID !!!!!

だから、明らかに、ここでアルファ値を設定しないことによって:

Friend Function CalculateColorsFromBaseColor(ByVal baseColor As Color) As List(Of Color) 
    Dim retList As New List(Of Color) 
    Dim r As Byte = baseColor.R 
    Dim g As Byte = baseColor.G 
    Dim b As Byte = baseColor.B 
    retList.Add(New Color With {.R = If(r * 1.4 > 255, 255, r * 1.4), .G = If(g * 1.4 > 255, 255, g * 1.4), .B = If(b * 1.4 > 255, 255, b * 1.4)}) 
    retList.Add(New Color With {.R = If(r * 1.2 > 255, 255, r * 1.2), .G = If(g * 1.2 > 255, 255, g * 1.2), .B = If(b * 1.2 > 255, 255, b * 1.2)}) 
    retList.Add(New Color With {.R = If(r * 0.8 > 255, 255, r * 0.8), .G = If(g * 0.8 > 255, 255, g * 0.8), .B = If(b * 0.8 > 255, 255, b * 0.8)}) 
    retList.Add(New Color With {.R = If(r * 0.6 > 255, 255, r * 0.6), .G = If(g * 0.6 > 255, 255, g * 0.6), .B = If(b * 0.6 > 255, 255, b * 0.6)}) 
    Return retList 
End Function 

私は透明色を作っていました。

STUPID、STUPID、STUPID !!!ここに作業コードがあります:

Friend Function CalculateColorsFromBaseColor(ByVal baseColor As Color) As List(Of Color) 
    Dim retList As New List(Of Color) 
    Dim r As Byte = baseColor.R 
    Dim g As Byte = baseColor.G 
    Dim b As Byte = baseColor.B 
    retList.Add(New Color With {.A = 255, .R = If(r * 1.4 > 255, 255, r * 1.4), .G = If(g * 1.4 > 255, 255, g * 1.4), .B = If(b * 1.4 > 255, 255, b * 1.4)}) 
    retList.Add(New Color With {.A = 255, .R = If(r * 1.2 > 255, 255, r * 1.2), .G = If(g * 1.2 > 255, 255, g * 1.2), .B = If(b * 1.2 > 255, 255, b * 1.2)}) 
    retList.Add(New Color With {.A = 255, .R = If(r * 0.8 > 255, 255, r * 0.8), .G = If(g * 0.8 > 255, 255, g * 0.8), .B = If(b * 0.8 > 255, 255, b * 0.8)}) 
    retList.Add(New Color With {.A = 255, .R = If(r * 0.6 > 255, 255, r * 0.6), .G = If(g * 0.6 > 255, 255, g * 0.6), .B = If(b * 0.6 > 255, 255, b * 0.6)}) 
    Return retList 
End Function 
関連する問題