Динамический фон Silverlight (с использованием градиента) на границе

Я довольно опытный разработчик.NET для настольных компьютеров, но я новичок в Silverlight. Я пытаюсь преобразовать приложение iOS в приложение 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 во время разработки, он отображается правильно. Когда я пытаюсь сделать это из-за кода, кажется, что я совсем не понимаю. (Если фон страницы в целом белый, то цвет моего пользовательского элемента управления такой же. Когда черный, то черный. Таким образом, кажется, что фон пользовательского элемента управления становится прозрачным.)

Пытаясь отладить это, я добавил следующий код в фоновое задание:

'' 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 ответ

Решение

Глупый, Глупый, Глупый!!!!!

Итак, по-видимому, не устанавливая альфа-значения здесь:

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 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
Другие вопросы по тегам