Свойство тега для элементов управления, не переносимых на статический метод - PullRequest
0 голосов
/ 10 февраля 2010

У меня есть метод ниже, в классе, HUD.cs, который имеет вспомогательные методы. Предполагается, что приведенный ниже метод проверяет все элементы управления TAG на наличие «необходимых» и выделяет те, которые он находит.

Это работает нормально, если я вызываю его из UserControl, а выделенные элементы управления не содержатся в GroupBox, но когда они являются TAG, кажется, не встречается. Идеи?

Вот метод ->

    public static void HighlightRequiredFields(Control container, Graphics graphics, Boolean isVisible)
    {
        var borderColor = Color.FromArgb(173, 216, 230);
        const ButtonBorderStyle borderStyle = ButtonBorderStyle.Solid;
        const int borderWidth = 3;

        Rectangle rect = default(Rectangle);
        foreach (Control control in container.Controls)
        {
            if (control.Tag is string && control.Tag.ToString() == "required")
            {
                rect = control.Bounds;
                rect.Inflate(3, 3);
                if (isVisible && control.Text.Equals(string.Empty))
                {
                    ControlPaint.DrawBorder(graphics, rect, 
                    borderColor,
                    borderWidth,
                    borderStyle,
                    borderColor,
                    borderWidth,
                    borderStyle,
                    borderColor,
                    borderWidth,
                    borderStyle,
                    borderColor,
                    borderWidth,
                    borderStyle);
                }
                else
                {
                    ControlPaint.DrawBorder(graphics, rect, container.BackColor, ButtonBorderStyle.None);
                }
            }

            if (control.HasChildren)
            {
                foreach (Control ctrl in control.Controls)
                {
                    HighlightRequiredFields(ctrl, graphics, isVisible);
                }
            }
        }
    }

1 Ответ

0 голосов
/ 10 февраля 2010

Это должно быть правильное расположение тегов (вы можете проверить это, войдя в отладчик), так что я думаю, что проблема скорее всего с чертежом. Есть несколько вещей, которые могут вызывать проблемы здесь.

Во-первых, свойство Control.Bounds относится к элементу parent . Поэтому, когда вы возвращаетесь в коллекцию дочерних элементов управления, прямоугольники отрисовываются в «неправильных» координатах: например, если дочерний элемент управления находится в верхнем левом углу группового блока, его границы могут быть (0,0,100,100), но вы на самом деле хотелось бы, чтобы прямоугольник отображался в координатах группового блока.

Во-вторых, я полагаю, что дочерний элемент управления, потому что это отдельный HWND, появится поверх графического контекста родительского элемента управления. То есть вы рисуете на родительском элементе управления (скажем, UserControl), но дочерний элемент управления (скажем, на GroupBox) находится выше этого уровня, скрывая ваш чертеж.

Для обеих этих проблем решение состоит в том, чтобы получить графический контекст дочернего элемента управления и передать его в рекурсивный вызов.

...