C # .NET (WinForm) - MainForm, разделенная на Меню (слева) и Содержимое (справа, дочерняя форма) - PullRequest
2 голосов
/ 14 мая 2011

Долгое время без работы над winform (сейчас я разработчик asp.net), но на этот раз мне нужно приложение, которое я использую сам, поэтому я начинаю работать этим утром, и появляются проблемы (с каждым началом проекта. ..lol).

Я думал о MainForm, разделив его на две стороны: левая сторона (около 20% ширины экрана), которая будет содержать MENU (menustrip?), А остальная часть будет стороной 'дочерняя форма'.

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

Там будет ТОЛЬКО одна форма одновременно на стороне контента (справа), но мне, вероятно, понадобится свойство ShowDialog для создания новой, отдельно от основной формы.

Проблема:

Я не знаю, какой элемент управления мне следует использовать в основной форме, чтобы разместить «заполнитель содержимого» (как asp.net) справа от основной формы, поэтому я могу динамически загружать / выгружать форму, нажимая в элементах меню.

Я знаю, как открыть новый диалог (form.ShowDialog и т. Д.), Но я не помню, возможно ли это или нет.

Ответы [ 3 ]

2 голосов
/ 14 мая 2011

Это очень распространенная модель пользовательского интерфейса. Вы начинаете, опуская SplitContainer на форму, которая дает вам две панели и разделитель, который можно настроить. Перетащите TreeView на левую панель, которая обеспечивает навигацию. Установите для свойства Dock значение Fill. Добавьте к нему несколько узлов, они будут «пунктами меню». Вы можете сделать это произвольно с помощью значков и вложенных узлов.

Вы отвечаете на выборы, сделанные пользователем, реализуя обработчик события для события AfterSelect в виде дерева. Распознать, по какому узлу щелкнули, используя свойство Tag или Text узла. Как это:

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) {
        switch (e.Node.Text) {
            case "Home":
                showScreen(new UserControl1());
                break;
            case "View":
                showScreen(new Form2());
                break;
            // etc...
        }
    }

Метод showScreen () должен заменить любой элемент управления, отображаемый на правой панели, на новый. Вы можете поддерживать формы, а также пользовательские элементы управления. Оба ведут себя хорошо в конструкторе Winforms, что позволяет вам сосредоточиться на их внешности. Как это:

    private void showScreen(Control ctl) {
        while (splitContainer1.Panel2.Controls.Count > 0)
            splitContainer1.Panel2.Controls[0].Dispose();
        // Support forms too:
        if (ctl is Form) {
            var frm = ctl as Form;
            frm.TopLevel = false;
            frm.FormBorderStyle = FormBorderStyle.None;
            frm.Visible = true;
        }
        ctl.Dock = DockStyle.Fill;
        splitContainer1.Panel2.Controls.Add(ctl);
    }

Это все, что нужно, просто сфокусируйтесь на реальных «экранах» отсюда.

1 голос
/ 14 мая 2011

Ваш английский на самом деле довольно хороший. То, что вы можете сделать, это вместо того, чтобы каждый пункт меню вызывал новый Form, фактически заставьте его создать новый Control. Поскольку вы хотите, чтобы только одно открывалось за раз, вы можете добавить панель в правой части главного окна и простые элементы управления переключением между этой панелью и из нее. Поэтому при нажатии MenuItem1:

MyControl1 newControl= new MyControl1();

newControl.Dock = DockStyle.Fill;
placeHolderPanel.Controls.Clear();
placeHolderPanel.Controls.Add(newControl);
0 голосов
/ 15 мая 2011

Я согласен с Хансом в отношении всего, за исключением того, что я хотел бы добавить, что, поскольку вы хотели бы использовать ФОРМЫ, которые будут помещены в основную форму, а не КОНТРОЛЬ, вам может понадобиться что-то подобное:

static public void ReplaceControl(Control ToReplace, Form ReplaceWith) {
    ReplaceWith.TopLevel=false;
    ReplaceWith.FormBorderStyle=FormBorderStyle.None;
    ReplaceWith.Show();
    ReplaceWith.Anchor=ToReplace.Anchor;
    ReplaceWith.Dock=ToReplace.Dock;
    ReplaceWith.Font=ToReplace.Font;
    ReplaceWith.Size=ToReplace.Size;
    ReplaceWith.Location=ToReplace.Location;
    ToReplace.Parent.Controls.Add(ReplaceWith);
    ToReplace.Visible=false;
}

Это позволит вам эффективно использовать заполнитель и вместо него использовать окно на основе формы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...