Динамический фон 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