Как создать диалог диалога предпочтений типа дерева в С#?
Я пишу приложение, которое в основном представляет собой диалог настроек, очень похожий на диалог предпочтений дерева, который использует сама Visual Studio. Функция приложения - это просто проход для данных из последовательного устройства в файл. Он выполняет много и много преобразований данных перед тем, как записывать их в файл, поэтому графический интерфейс для приложения - это просто все параметры, которые определяют, что должны делать эти преобразования.
Каков наилучший способ разработки/кодирования диалогового окна настроек дерева? То, как я это делал, - это построение главного окна с прикрепленным деревом слева. Затем я создаю элементы управления контейнером, соответствующие каждому node дерева. Когда выбрано node, приложение добавляет этот элемент управления node к передней панели, перемещает его в нужное положение и максимизирует его в главном окне. Это кажется действительно, действительно неуклюжим при проектировании. Это в основном означает, что у меня есть тонны элементов управления контейнером за краем главного окна во время разработки, и я должен продолжать прокручивать главное окно, чтобы работать с ними. Я не знаю, действительно ли это имеет смысл, как я пишу это, но, возможно, этот визуальный для того, что я говорю, будет иметь больше смысла:
![form design]()
В основном я должен работать с этой огромной формой, с управлением контейнерами повсюду, а затем выполнять кучу переформатирования во время выполнения, чтобы все это работало. Это похоже на большую работу. Я делаю это совершенно глупо? Есть ли какой-то "очевидный" более простой способ сделать это, чтобы я отсутствовал?
Ответы
Ответ 1
Более удобный способ - создать отдельные формы для каждой "панели" и в каждом конструкторе формы установить
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
Грег Харльман писал:
Почему бы просто не показать/скрыть соответствующий контейнер, если в сетке выбран node? Удостоверьтесь, что контейнеры имеют одинаковый размер в одном месте и скрыть все, кроме значения по умолчанию, которое будет предварительно выбрано в сетке при загрузке.
К сожалению, этого я пытаюсь избежать. Я ищу простой способ обработки интерфейса во время разработки с минимальным кодом переформатирования, необходимым для его работы во время выполнения.
Мне нравится ответ Duncan, потому что это означает, что дизайн каждого интерфейса node может быть полностью разделен. Это означает, что я не получаю совпадение с рекомендациями привязки и другими преимуществами времени разработки.
Ответ 3
Я бы, вероятно, создал несколько панельных классов на основе базового класса, наследующего CustomControl. Тогда эти элементы управления будут иметь такие методы, как Save/Load и т.д. Если это так, я могу отдельно разделить каждую из этих панелей.
Я использовал элемент управления Wizard, который в режиме разработки обрабатывал несколько страниц, чтобы можно было щелкнуть дальше в дизайнере и спроектировать все страницы сразу через конструктор. Хотя это связано с несколькими недостатками при подключении кода к элементам управления, это, вероятно, означает, что вы можете создать аналогичную настройку, создав некоторые классы дизайнеров. Я никогда не писал никаких конструкторских классов в VS, поэтому я не могу сказать, как это сделать, или если это стоит: -)
Мне немного любопытно, как вы собираетесь обрабатывать нагрузку/сохранять значения в/из элементов управления? Должно быть много кода в одном классе, если все ваши страницы находятся в одной большой форме?
И еще одним способом было бы, конечно, генерировать код gui по мере запроса каждой страницы, используя информацию о том, какие типы настроек есть.