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

StackOverflow https://stackoverflow.com/questions/3725

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

form design

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

Это было полезно?

Решение

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

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.Тогда эти элементы управления будут иметь такие методы, как «Сохранить/Загрузить» и тому подобное.Если да, то я могу спроектировать каждую из этих панелей отдельно.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top