Изменение свойств активного элемента управления автоматически - PullRequest
1 голос
/ 03 марта 2012

Пожалуйста, примите во внимание, что я новичок в c #.После сканирования около 700 сообщений я решил опубликовать еще один вопрос:

В форме Windows (c #) у меня есть некоторые элементы управления, включая текстовые поля, флажки и так далее.Я хочу изменить цвет фона всякий раз, когда элементы управления становятся активными.Я знаю, что мог бы вызывать события 'enter' и 'exit' для каждого элемента управления, чтобы изменить соответствующие свойства, но должен быть другой способ.

Ответы [ 3 ]

2 голосов
/ 03 марта 2012

Просто подключите события Enter и Leave - переключение цвета в каждом. Сохраните последний цвет, сохраненный в OnEnter для использования в OnLeave

public Form1()
{
    InitializeComponent();

    var lastColorSaved = Color.Empty;

    foreach(Control child in this.Controls)
    {
        child.Enter += (s, e) =>
                            {
                                var control = (Control)s;
                                lastColorSaved = control.BackColor;
                                control.BackColor = Color.Red;
                            };
        child.Leave += (s, e) =>
                            {
                                ((Control)s).BackColor = lastColorSaved;
                            };
    }
}
1 голос
/ 03 марта 2012

Вы настраиваете управляющие классы так же, как настраиваете любой класс, извлекаете свой собственный класс и переопределяете виртуальные методы. Произвольно:

using System;
using System.Drawing;
using System.Windows.Forms;

class MyTextBox : TextBox {
    protected override void OnEnter(EventArgs e) {
        prevColor = this.BackColor;
        this.BackColor = Color.Cornsilk;
        base.OnEnter(e);
    }
    protected override void OnLeave(EventArgs e) {
        this.BackColor = prevColor;
        base.OnLeave(e);
    }
    private Color prevColor;
}

Теперь любой MyTextBox, который вы перетаскиваете на форму, будет иметь такое поведение без необходимости реализовывать события. Хотя, конечно, нет ничего плохого в использовании событий.

1 голос
/ 03 марта 2012

Создайте класс (например, ControlColorizer) и в его конструкторе передайте:

1) Цвет фона для «активного управления» и сохранение во внутренней переменной цвета
2) управляющий массив переменной длины

В конструкторе добавьте один и тот же обработчик событий для OnEnter и OnLeave для каждого элемента управления
В событии OnEnter установите фоновый цвет
В событии OnLeave установить стандартный цвет фона

Преимущество всего в использовании класса:

1) Объявите глобальный экземпляр в вашем классе формы
2) Инициализируйте в конструкторе формы после InitializeComponent.
3) Забудь обо всем остальном. Никакого другого кода не требуется

Итак, позвольте мне объяснить все с помощью кода:

Это будет в файле с именем ControlColorizer.cs

public class ControlColorizer
{
    private Color _setBColor = SystemColors.Window;

    public ControlColor(Color bkg, params Control[] ctls)
    {
        _setBColor = bkg;
        foreach (Control o in ctls)
        {
            o.Enter += new EventHandler(o_Enter);
            o.Leave += new EventHandler(o_Leave);
        }
    }

    private void o_Enter(object sender, EventArgs e)
    {
        if (sender is Control)
        {
            Control c = (Control)sender;
            c.BackColor = _setBColor;
        }

    }
    private void o_Leave(object sender, EventArgs e)
    {
        Control c = sender as Control;
        c.BackColor = SystemColors.Window;
    }

Теперь, в каждом конструкторе форм, где вам нужна функциональность, у вас есть этот

ControlColirizer _ccz;
public Form1() 
{ 
    InitializeComponent(); 
    // Create an instance of ControlColorizer, pass the background color 
    // the list of Controls and that's all 
    _ccz = new ControlColorizer(Color.LightYellow, this.TextBox1, 
               this.TextBox2, this.TextBox3, this.TextBox4);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...