У меня есть приложение WinForms, которое на данный момент полностью функционально, около 15-20 элементов. Я хотел бы иметь возможность переключаться между двумя представлениями: «расширенным» и другим «простым».

«Расширенный» вид будет таким же, как сейчас, «простой» вид скроет все, кроме одного элемента управления, и добавит 5 дополнительных.

Как лучше всего это сделать? Я думаю, что простая установка свойств .Visible одно за другим, чтобы скрыть материал, не будет хорошей практикой. Я также не хотел бы дублировать элементы управления или код.

Я, очевидно, должен был подумать об этом вначале, но эта потребность только что пришла ко мне. Будем признательны за любые указатели в правильном направлении.

0
blawford 29 Авг 2014 в 11:06
1
Я думаю, Panelуправление контейнером могло бы помочь в этом. Вы можете показать и скрыть панель в соответствии с вашими требованиями.
 – 
Hassan
29 Авг 2014 в 11:10
Это или GroupBox — опять же, очень похожее использование в обоих случаях. или вы можете использовать элемент управления вкладками. Множество различных вариантов, каждый из которых имеет свои достоинства
 – 
jbutler483
29 Авг 2014 в 13:46

2 ответа

Лучший ответ

Это то, чем я закончил. У меня есть две панели одинакового размера и положения, и axWindowsMediaPlayer - это элемент управления, который я хотел использовать на обеих:

if (panelExtendedLayout.Visible)
{
    panelSimpleLayout.Visible = false;
    panelExtendedLayout.Visible = true;

    panelExtendedLayout.Controls.Remove(axWindowsMediaPlayer);
    panelSimpleLayout.Controls.Add(axWindowsMediaPlayer);
}
else
{
    panelSimpleLayout.Visible = true;
    panelExtendedLayout.Visible = false;

    panelExtendedLayout.Controls.Remove(axWindowsMediaPlayer);
    panelSimpleLayout.Controls.Add(axWindowsMediaPlayer);
}

Это работает и выглядит довольно плавно, видео продолжает воспроизводиться, а все остальные элементы управления появляются / исчезают одним нажатием кнопки. У меня была начальная проблема, когда panelSimiple был установлен как дочерний элемент panelExtended из-за того, что я перетащил его на то же место, мне пришлось отредактировать это в коде дизайна.

0
blawford 29 Авг 2014 в 12:58

Добавьте в свое приложение 2 элемента управления Panel и поместите все «простые» элементы управления на одну панель, а все «расширенные» элементы управления - на вторую.

Panel panelSimple = new Panel();
panelSimple.Location = new Point(1,1);
panelSimple.Size = new Size(500,500);
panelSimple.Controls.Add(simpleTexbox); 
panelSimple.Controls.Add...

Panel panelExtended= new Panel();
panelExtended.Location = new Point(1,1);
panelExtended.Size = new Size(500,500);
panelExtended.Controls.Add(extendedButton); 
panelExtended.Controls.Add...

Затем просто установите флаг .Visible для панелей на false или true в зависимости от того, что вам нужно (вам нужно убедиться, что оба они не будут видны одновременно или невидимы в этом отношении)

0
Vajura 29 Авг 2014 в 11:15
Я понимаю, что вы говорите в теории, просто немного борюсь с реализацией. Как мне перейти от того, что у меня есть сейчас, к тому, что вы предлагаете? Я не совсем понимаю, как добавлять все элементы на панели в коде, когда они уже созданы.
 – 
blawford
29 Авг 2014 в 11:50
Просто установите control.parent = panel.
 – 
γηράσκω δ' αεί πολλά διδασκόμε
29 Авг 2014 в 12:01
Я думаю, вы добавляете все эти элементы управления в графический интерфейс, верно? Затем вы можете сделать то же самое с этим. Просто добавьте 2 элемента управления панелью из левого раскрывающегося меню в свое приложение и установите их расположение и размер в окне свойств на одинаковые значения. Затем поместите элементы управления (текстовые поля, кнопки и т. д.) на панели. Проблема в том, что если у вас есть элемент управления, который находится на обеих панелях, вам нужно будет дублировать все для него, вместо этого, если вы создаете все свои формы в коде, гораздо проще отслеживать все. Я могу написать вам короткий код, если хотите
 – 
Vajura
29 Авг 2014 в 12:06
У меня есть две панели, все, что в настоящее время добавлено к первой. Я добавил элемент управления на вторую панель, но он не отображается во время выполнения. Можете ли вы привести пример того, как добавить элемент управления, который находится на первой панели, на вторую панель? Когда вы говорите «дублировать все для него», что вы имеете в виду? Я бы предпочел не создавать каждый элемент управления в коде вручную.
 – 
blawford
29 Авг 2014 в 12:19
Что ж, первая панель находится над второй панелью, если вы хотите увидеть вторую панель, вам нужно скрыть первую и наоборот, если вы настроили ее так, чтобы они имели одинаковое расположение и размер. И как дубликат я имел в виду, что вам нужно либо создать другое текстовое поле, кнопку и т. д. с теми же настройками, что и на первой панели, и поместить его на вторую панель. Вот почему было бы намного лучше, если бы вы сделали их программно, а затем просто создали два экземпляра.
 – 
Vajura
29 Авг 2014 в 12:36