#vb.net #recursion #components
#vb.net #рекурсия #Компоненты
Вопрос:
Я пытаюсь перекрасить все компоненты в форме с помощью рекурсивного метода. Однако оно всегда перекрашивает форму, а затем останавливается. Как я могу заставить его пройти этот шаг? Вот код, с которым я экспериментировал:
Public Sub fixUIIn(ByRef comp As System.ComponentModel.Component, ByVal style As SByte)
Debug.WriteLine(comp)
If TypeOf comp Is System.Windows.Forms.ContainerControl Then
Dim c As System.Windows.Forms.ContainerControl
c = comp
c.BackColor = getColor(style, PART_BACK)
c.ForeColor = getColor(style, PART_TEXT)
If ((comp.Container IsNot Nothing) AndAlso (comp.Container.Components IsNot Nothing)) Then
For i As Integer = 0 To comp.Container.Components.Count() Step 1
fixUIIn(comp.Container.Components.Item(i), style)
Next
End If
comp = c
End If
If TypeOf comp Is System.Windows.Forms.ButtonBase Then
Dim c As System.Windows.Forms.ButtonBase
c = comp
c.FlatStyle = Windows.Forms.FlatStyle.Flat
c.BackColor = getColor(style, PART_BOX)
c.ForeColor = getColor(style, PART_TEXT)
comp = c
End If
If ((comp.Container IsNot Nothing) AndAlso (comp.Container.Components IsNot Nothing)) Then
For i As Integer = 0 To comp.Container.Components.Count() Step 1
fixUIIn(comp.Container.Components.Item(i), style)
Next
End If
End Sub
Комментарии:
1. Вы запускаете это так, чтобы comp = ваша текущая форма? Попробуйте вместо этого запустить его в элементе управления вашей формы.
Ответ №1:
Вы переименовываете только элементы управления кнопками и элементами управления контейнерами, есть ли для этого причина? В вопросе указано «все», поэтому я и спрашиваю..
Я также абсолютно ненавижу используемый старый код в стиле VB6. Почему вы передаете color как sByte, а не просто Color? Конструкция Foreach также намного проще в использовании, чем цикл for с индексами.
Я бы написал это следующим образом:
Public Sub FixUIColors(control As Control, foreColor As Drawing.Color, backColor As Drawing.Color)
control.BackColor = foreColor
control.ForeColor = backColor
If TypeOf control Is ButtonBase Then
DirectCast(control, ButtonBase).FlatStyle = FlatStyle.Flat
End If
' iterate through child controls
For Each item In control.Controls
FixUIColors(item, foreColor, backColor)
Next
End Sub
Если вы хотите ограничить только определенные типы, вы могли бы сделать что-то вроде:
Select Case control.GetType
Case GetType(ContainerControl)
Case GetType(ButtonBase)
control.BackColor = foreColor
control.ForeColor = backColor
End Select
Меня смущает ваше использование style as SByte
и PART_BOX
PART_TEXT
etc, так что, вероятно, это не совсем то, что вы хотите. Я думаю, что это неправильная передача, вы должны просто передать System.Рисование.Цвет (и причина в том, что кто-то вроде меня может легко прочитать и понять этот код). Если вам нужно сохранить кучу цветов в одном объекте, чтобы упростить передачу, то вы можете создать класс для хранения этого материала. Распаковка байта в набор цветов — это другая задача, которая должна обрабатываться другой функцией.
Комментарии:
1. Спасибо! К сожалению, я установил несколько операционных систем с тех пор, как был задан этот вопрос, и не могу проверить этот ответ:<