Я довольно опытный разработчик .NET для настольных компьютеров, но я новичок в Silverlight.Я пытаюсь преобразовать приложение iOS в приложение Silverlight.
Приложение представляет собой список элементов, созданных с использованием данных, извлеченных из базы данных.Эти данные включают в себя большое количество текстов меток, а также информацию о цвете переднего плана и фона.Каждый объект имеет свой собственный пользовательский элемент управления.Он состоит из пограничного элемента управления (для окраски фона и закругленных краев) с сеткой внутри.Все мои элементы управления метками (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
Все результаты в окне сообщений соответствуют ожидаемым, но все же я не получаю фонового градиента.У кого-нибудь есть идеи, что происходит?
Спасибо!