Как создать древовидный вид диалогового окна типа интерфейса в C #? - PullRequest
13 голосов
/ 06 августа 2008

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

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

form design

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

Ответы [ 3 ]

10 голосов
/ 06 августа 2008

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

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();
2 голосов
/ 06 августа 2008

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

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

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

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

0 голосов
/ 14 августа 2008

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

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

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

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

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