Подтвердить что ты не робот

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

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

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

form design

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

4b9b3361

Ответ 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 по мере запроса каждой страницы, используя информацию о том, какие типы настроек есть.