c # главное меню и формы mdi - PullRequest
2 голосов
/ 21 июля 2010

До сих пор, как разработчик .net, я интенсивно использовал формы mdi для отображения определенных «пунктов меню», таких как, например, «модуль 1», «модуль 2» и т. Д.

Я делал это следующим образом:

  • создать родительскую форму с установленным значением true для isMdiContainer
  • создать полосу меню в контейнере mdi
  • создать дочернюю форму, реализующую синглтон, чтобы форма отображалась только один раз
  • Добавьте что-то вроде следующего кода в контейнер mdi:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Myapp
{

public partial class MdiContainer : Form
{
    private module1 Module1Window;
    private module2 Module2Window;
    private module3 Module3Window;

    public FormContainer()
    {
        InitializeComponent();
        this.Module1Window = modul1.getInstance();
        this.Module1Window.MdiParent = this;
        this.Module2Window = modul2.getInstance();
        this.Module2Window.MdiParent = this;
        this.Module3Window = modul3.getInstance();
        this.Module3Window.MdiParent = this;
        this.Module1Window.Show();
    }
    private void module1ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Module3Window.Hide();
        this.Module2Window.Hide();
        this.Module1Window.Show();
    }       
    private void module2ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Module1Window.Hide();
        this.Module3Window.Hide();
        this.Module2Window.Show();
    }
    private void module3ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Module1Window.Hide();
        this.Module2Window.Hide();
        this.Module3Window.Show();
    }
}

}

Теперь это, очевидно, работает нормально. Но это боль, чтобы поддерживать. Каждый раз, когда я хочу добавить другую дочернюю форму, я должен:

  • агрегат Singleton
  • создать соответствующее свойство в контейнере mdi
  • получить экземпляр и установить родителя mdi
  • Скрыть новую форму при нажатии других кнопок
  • Показать форму и скрыть все остальные формы при нажатии соответствующей кнопки

Какой более элегантный или, скажем так, эффективный подход к архивированию этого?

1 Ответ

1 голос
/ 21 июля 2010

Когда вы создаете пункты меню?Создаются ли они динамически вместе с дочерними формами?

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

private void menuStrip_Click(object sender, EventArgs e)
{
    var menu = (ToolStripItem)sender;
    var viewForm = (Form)sender.Tag;
    foreach(Form childForm in _childForms)
        childForm.Hide();
    viewForm.Show();
}

Этот один и тот же обработчик можно использовать независимо от количества форм.у вас может быть ключ в качестве тега и Dictionary<string, Form>, чтобы вы могли более лениво создавать формы, но концепция та же.

...