Измените цвет спины любой открытой формы в C#
По этой теме
у меня есть меню в проекте C# (win app), чтобы при щелчке по каждому его элементу открывалась форма! как я уже сказал, у меня есть 37 форм, и я хочу сделать это: всякий раз, когда форма открывается внутри MainForm (Form1), щелкая элементы меню, я хочу установить цвет спины формы, но я не хочу делать это один за другим (удобно), есть ли способ?! Благодарю.
5 ответов
У вас должен быть BaseForm Class как этот, который наследует Form Form
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 вместо класса Form, как я сделал в классе MainForm здесь "публичный частичный класс MainForm: BaseForm"
Возможность - создать базовый класс форм, который вы теперь можете использовать во всех ваших формах.
Если вы не хотите изменять цвет фона для всех форм, вместо того, чтобы формы наследовали от формы, сделайте их наследниками от 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), если вам нужно.
Вы имеете в виду это?:
В полосе меню щелкните обработчик события, где вы на самом деле собираетесь снимать форму.
Form myNewForm = new Form();
myNewForm .BackColor = Color.X;
После показать свою форму...
Сначала вы должны хранить все открытые формы в какой-то коллекции. Например:
private List<Form> _childForms = new List<Form>();
каждый раз, когда вы открываете форму, вы добавляете ее в эту коллекцию и добавляете закрытый обработчик, чтобы удалить ее, когда она закрыта:
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-детей, вы можете обойтись без коллекции и вашего this.MdiChildren
вместо:
void SetBackgroundColorToAllMdiChildren(Color color)
{
foreach(var form in this.MdiChildren)
form.BackColor = color;
}
Не совсем понятно, что вы имеете в виду, когда форма открывается внутри 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.
РЕДАКТИРОВАТЬ:
Конечно, этот подход будет работать, только если вы добавляете внутренние формы к элементам управления основной формы.
В любом случае, я не думаю, что то, как разрабатывается приложение, должно основываться на "я не хочу менять 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 минут), но при этом ваше приложение должно быть чистым, открытым для будущих изменений и расширений. Все остальное может быть веселым и интересным для экспериментов, но я бы не стал использовать это в рабочем коде.