Изменить задний цвет любой открытой формы во время выполнения в C # - PullRequest
2 голосов
/ 01 сентября 2011

согласно этой теме

У меня есть меню в проекте C # (win app), чтобы при щелчке на каждом его элементе открывалась форма! как я уже сказал, у меня есть 37 форм, и я хочу сделать это: всякий раз, когда форма открывается внутри MainForm (Form1), щелкая элементы меню, я хочу установить цвет спины формы, но я не хочу делать это один за другим (удобно), есть ли способ ?! спасибо.

Ответы [ 5 ]

1 голос
/ 01 сентября 2011

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

Если вы не хотите изменять цвет фона для всех форм, вместо того, чтобы наследовать формы от формы, сделайте так, чтобы они наследовали от MyFormBaseClass.

Нет четкого способа понять, из какой формы вы открываете форму, кроме того, что вы указываете форму owber при выполнении myform.Show (this);

В MyFormBaseClass переопределите OnLoad и поместите что-то вроде этого:

protected override OnLoad(EventArgs e)
{
    if (this.Owner is MyOwnerFormClass) { this.BackColor = Color.Blue; }
    base.OnLoad(e);
}

Вы также можете использовать это для добавления более сложных операций, общих для всех ваших форм.

Вы можете заменить все базовые классы формы поиском и заменить во всем вашем проекте.

Вы должны создать MyFormBaseClass как обычную форму, чтобы конструктор работал.

Нажмите CTRL + H, выберите «заменить» во всем проекте, замените «: Form» на «: MyFormBaseClass», нажимайте «Далее» до тех пор, пока не закончите, то есть 37 раз.

Вы также можете заменить .Show () на .Show (this), если вам нужно.

0 голосов
/ 19 февраля 2015

Вы должны иметь класс BaseForm, подобный этому, который наследует класс формы

 public partial class BaseForm : Form
 {
    protected override void OnLoad(EventArgs e)
    {
       Color colBackColor =Properties.Settings.Default.FormsBackgroundColor;
       BackColor = colBackColor;
    }
  }

, и класс MainForm, подобный этому, который наследует класс BaseForm.

public partial class MainForm : BaseForm
{
    private void button1_Click_1(object sender, EventArgs e)
    {
            ColorDialog colorDlg = new ColorDialog();
            if (colorDlg.ShowDialog() == DialogResult.OK)
            {
                Properties.Settings.Default.FormsBackgroundColor= colorDlg.Color;
                Properties.Settings.Default.Save();
                this.BackColor = colorDlg.Color;
            }
        }    
 }

Все классы должны наследовать класс BaseFormвместо класса формы, как я сделал в классе MainForm здесь "публичный частичный класс MainForm: BaseForm "

0 голосов
/ 01 сентября 2011

сначала вы должны хранить все открытые формы в какой-то коллекции. Например:

private List<Form> _childForms = new List<Form>();

каждый раз, когда вы открываете форму, вы добавляете ее в эту коллекцию и добавляете обработчик closed , чтобы удалить ее, когда она закрыта:

void AddForm(Form toAdd)
{
   _childForms.Add(toAdd);
   toAdd.Closed += (sender, e) => { _childForms.Remove(toAdd); }
}

Теперь вы можете использовать

void SetBackgroundColorToAllChidForms(Color color)
{
   foreach(var form in _childForms)
      form.BackColor = color;
}

чтобы изменить цвет каждого из них.

PS: если вы добавите их как MDI-Children, вы можете обойтись без коллекции и вместо нее this.MdiChildren:

void SetBackgroundColorToAllMdiChildren(Color color)
{
   foreach(var form in this.MdiChildren)
      form.BackColor = color;
}
0 голосов
/ 01 сентября 2011

Не совсем понятно, что вы имеете в виду, когда форма открывается внутри MainForm (Form1) . Если вы добавляете форму в элементы управления Form1, вы можете использовать событие ControlAdded формы Form1 примерно так:

this.ControlAdded += new System.Windows.Forms.ControlEventHandler(this.Control_Added);

private void Control_Added(object sender, System.Windows.Forms.ControlEventArgs e)
{
    if (e.Control is Form)
        ((Form)e.Control.BackColor = Color.Blue;
}

Если у вас приложение Mdi, вы можете использовать вместо него событие MdiChildActivate.

EDIT:

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

В любом случае, я не думаю, что то, как разрабатывается приложение, должно основываться на «я не хочу менять 37 методов» и искать хитрости и обходные пути. Для меня лучшее и более чистое решение в этом случае состояло бы в том, чтобы избежать подклассов, событий и чего-либо еще и просто внедрить новый метод, подобный этому, в вашей основной форме:

private void PrepareAndShow(Form aForm)
{
    aForm.BackColor = Color.Blue;
    // here you can add (even in the future) all the preprocessing you want
    aForm.Show();
}

Тогда вам, конечно, придется изменить все методы для пунктов меню, вызывающих его:

Form aFrm = new Form2();
this.PrepareAndShow(aFrm); // instead of aFrm.Show();

Таким образом, вы должны изменить 37 методов (думаю, менее 10 минут работы), но держать свое приложение в чистоте, открытым для будущих изменений и расширений. Все остальное может быть веселым и интересным для экспериментов, но я бы не стал использовать это в рабочем коде.

0 голосов
/ 01 сентября 2011

Вы имеете в виду это?:
В строке меню щелкните обработчик события, где вы на самом деле собираетесь снимать форму ..

Form myNewForm = new Form(); 
myNewForm .BackColor = Color.X;

После показа вашей формы ...

...