2014-02-09 4 views
0

Я опытный разработчик MVC, который сделал мою первую попытку создания внутреннего продукта WinForms для компании, в которой я работаю.WinForms: Показать новую форму в том же окне

Когда мое приложение сначала загружает его, загружает LoginForm (который наследует от BaseForm, чтобы установить такие параметры, как размер окна, свойства NotifyIcon и т. Д.). При успешном входе в систему я хочу сохранить одно и то же окно, но заменить содержимое на новый экран. Это кажется довольно простым, но даже после поиска, как это сделать, никто из них не работает, как я ожидал.

Я пробовал такой код:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Window1 W1 = new Window1(); 
    W1.Show(); 
    this.Close();  
} 

Но, конечно же, что открывает новое окно и закрывает текущую, который не то, что я хочу. Я хочу сохранить одно и то же родительское окно и просто заменить содержимое.

У меня есть два вопроса (они вроде родственных):

1) Как просто заменить содержимое окна родителя с новой формой, а не открывать его в новом окне? Сейчас мои формы находятся в отдельных элементах управления WinForms (LoginForm и ChatForm). Нужно ли мне проектировать проект по-другому, чтобы это сделать?

2) ChatForm содержит SplitContainer с кнопками слева (см. Снимок экрана ниже). При нажатии каждой кнопки содержимое правой панели должно измениться. Будет ли это лучше всего представлено UserControls (один для ChatQueue, один для ChatWindow, передача параметров, чтобы он знал, с кем мы общаемся)?

Просто пытаясь окунуться в основную архитектуру проекта WinForms и навигация между различными экранами контента.

enter image description here

+0

Мое предложение было бы очистить все элементы управления (или те, которые хотите уйти), а затем добавить других в ту же форму. – MiKE

ответ

2

Вы можете поставить первый «Окно» 's управления на панели с Dock = DockStyle.Fill вместо того, чтобы непосредственно на форме. И второй элемент управления «Window» на другой аналогичной панели Dock. Обе панели находятся на форме. Затем panel1.SendToBack();. (Или panel2.BringToFront();.)

Или вы можете:

Controls.Remove(panel1); 
Controls.Add(panel2); 

, если вы хотели бы сделать это.

0

Я бы настоятельно рекомендовал вам создать пользовательский контроль пользователя и пользовательский контроль чата.

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

Что касается архитектуры, размещение всех элементов управления на уровне окна или использование элементов управления макетами (панелей) для создания логического разделения не рекомендуется.

Создание хорошей hirerchy пользовательских элементов управления является стандартной архитектурой для приложений winforms.

Удачи.

1

1) Да, вы должны архитектовать проект по-другому.

Подумайте о форме как о форме одного родителя.Все остальные формы (Login, Chat) должны быть спроектированы как пользовательские элементы управления. Затем вы должны поместить все элементы управления в родительскую форму и управлять программным обеспечением этих элементов управления, т. Е. Login должен предшествовать чату и т. Д. Затем введите класс, похожий на NavigationController, который будет отвечать за управление последовательностью элементов управления, т. Е. скрыть логин и показать чат и т. д. Класс может поддерживать стек внутри для управления переходами.

2) Да, вы правы. Здесь применяется та же концепция использования UserControls!

И это правда, что разработчики MVC находят очень трудное время при работе с WinForms. Но хорошей новостью является то, что вы можете выполнить аналогичный дизайн в WinForms, вручную используя теоретические концепции MVC.

0

Чтобы получить этот эффект, я бы выложил правую часть с помощью TabControl и просто переключил вкладку на основе нажатой кнопки.

Есть способы скрыть вкладки, если хотите, что бы имитировать что-то вроде замены Panel элементов управления, но без уродливых звонков Controls.Add().

Смежные вопросы