私はかなり経験豊かな.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
メッセージボックスの結果のすべては予想通りですが、それでも、私は背景のグラデーションを取得していません。誰が何が起こっているか考えている?
ありがとうございます!