Рекурсивное перекрашивание в VB

#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. Спасибо! К сожалению, я установил несколько операционных систем с тех пор, как был задан этот вопрос, и не могу проверить этот ответ:<