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

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

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

дизайн формы

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

Ответов (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();

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

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

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

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

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

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

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

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