Как создать древовидный вид диалогового окна типа интерфейса в C #?

Я пишу приложение, которое по сути является просто диалогом настроек, во многом похожим на диалог настроек в виде дерева, который использует сама Visual Studio. Функция приложения - это просто передача данных с последовательного устройства в файл. Он выполняет множество преобразований данных перед записью их в файл, поэтому графический интерфейс приложения - это просто все настройки, которые определяют, какими должны быть эти преобразования.

Каков наилучший способ разработки / кодирования диалога настроек в виде дерева? То, как я это делал, строит главное окно с прикрепленным элементом управления деревом слева. Затем я создавал контейнерные элементы управления, которые соответствуют каждому узлу дерева. Когда узел выбран, приложение переносит соответствующий элемент управления контейнера этого узла на передний план, перемещает его в правильную позицию и максимизирует его в главном окне. Это кажется очень, очень неуклюжим при разработке. По сути, это означает, что у меня есть тонны элементов управления контейнером за краем главного окна во время разработки, и мне приходится постоянно прокручивать главное окно, чтобы работать с ними. Я не знаю, имеет ли это смысл в том, как я пишу это, но, возможно, это визуальное представление о том, о чем я говорю, будет иметь больше смысла:

дизайн формы

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

6.08.2008 17:22:27
3 ОТВЕТА
РЕШЕНИЕ

Более простой способ - создать отдельные формы для каждой «панели» и в каждом конструкторе формы установить

this.TopLevel = false;
this.FormBorderStyle = FormBorderStyle.None;
this.Dock = DockStyle.Fill;

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

Возможно, основная форма могла бы использовать SplitContainerстатический элемент TreeViewв одной панели и пространство для добавления этих форм в другой. Как только они добавлены, их можно пролистать с помощью Hide/Showили BringToFront/SendToBackметодов.

SeparateForm f = new SeparateForm(); 
MainFormSplitContainer.Panel2.Controls.Add(f); 
f.Show();
11
17.01.2016 12:49:42

Грег Херлман писал:

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

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

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

2
6.08.2008 18:20:29

Вероятно, я бы создал несколько классов панелей на основе базового класса, наследующего CustomControl. Эти элементы управления будут иметь такие методы, как Save / Load и тому подобное. Если это так, я могу разработать каждую из этих панелей отдельно.

Я использовал элемент управления Wizard, который в режиме конструктора обрабатывал несколько страниц, чтобы можно было щелкнуть далее в конструкторе и оформить все страницы сразу через конструктор. Хотя при подключении кода к элементам управления это имело несколько недостатков, это, вероятно, означает, что вы можете создать аналогичную настройку, создав несколько классов дизайнеров. Я никогда сам не писал никаких дизайнерских классов в VS, так что я не могу сказать, как и стоит ли это того :-)

Мне немного любопытно, как вы собираетесь обрабатывать загрузку / сохранение значений в / из элементов управления? В одном классе должно быть много кода, если все ваши страницы находятся в одной большой форме?

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

0
14.08.2008 15:17:18