Сложный .Net 2.0 контроль Windows Forms: с чего начать? - PullRequest
5 голосов
/ 04 декабря 2009

Чтобы создать удобный пользовательский интерфейс для приложения .Net 2.0 Winforms, над которым я работаю, мне нужен элемент управления, который, я уверен, выходит за рамки стандартного поведения любого стандартного элемента управления. Макет того, чего я пытаюсь достичь, выглядит следующим образом:

Макет http://www.claware.com/images/temp/mockup.png

По сути, эта часть приложения пытается разобрать слова в слоги из племенных языков (нет словаря, на который можно сослаться; возможны все символы Юникода.) Когда пользователь зашел так далеко, он уже определил гласные / согласные на его языке и некоторые другие конфигурации. Затем происходит итерационный процесс: (1) приложение угадывает, какие слоги существуют в языке на основе некоторых правил, (2) пользователь уточняет догадки, выбирает правильные разборы или анализирует слово вручную, (3) приложение «запоминает «Исходя из отзывов пользователей и делая более умные догадки, (4) повторяйте, пока данные не станут« достаточно хорошими », чтобы двигаться дальше.

Элемент управления должен представить каждое слово (серые заголовки), а затем угадать все разрывы слога (белые области с точками, разделяющими части слов). Существует также способ ввода синтаксического анализа вручную, который будет отображать область текста и кнопка сохранения (внизу макета). Когда пользователь наводит курсор на предположение, фон меняется и появляются кнопки «принять / отклонить». Нажав на Принять, или введя ручной анализ, удаляет все слово из списка. Нажатие на кнопку отклонения удаляет только этот элемент.

Я ни в коем случае не на 100% продан с форматированием, которое у меня есть выше, но я думаю, что вы можете получить общее представление о типах форматирования и функционального контроля, которые мне нужны. Элемент управления также будет прокручиваться вертикально - изначально могут быть тысячи слов.

Мой вопрос к вам, опытным разработчикам WinForms: с чего начать? Мне бы очень хотелось остаться в рамках ядра .Net и расширить существующий элемент управления, а не сторонний элемент управления. (С риском начать религиозную войну: да, я страдаю от NIH-синдрома, но это сознательное решение, основанное на множестве быстрых решений, но долгосрочных проблемах со сторонним контролем.) Где я могу получить больше всего "удар для моего доллара" и наименее изобретать велосипед? Посмотреть список? ListBox? ScrollableControl? Нужно ли мне возвращаться к контролю и рисовать все вручную? Я ценю любую помощь, которая может быть оказана!

[Редактировать] Спасибо всем за идеи. Похоже, что самое элегантное решение для моих целей - создать пользовательский элемент управления, состоящий из FlowLayoutPanel и VScrollBar. FlowLayoutPanel может содержать экземпляры пользовательских элементов управления, используемых для каждого слова. Но FlowLayoutPanel является виртуальным, т. Е. Содержит только те экземпляры, которые видны (и некоторые «просто вне прокрутки»). События VScrollBar определяют, что должно быть загружено. Немного кода для написания, но не так уж плохо и, кажется, работает хорошо.

Ответы [ 4 ]

4 голосов
/ 04 декабря 2009

Я бы посмотрел на элементы управления TableLayoutPanel и FlowLayoutPanel. Это позволит вам организовать серию элементов управления с умеренной легкостью по вертикали. Затем я бы создал UserControl, который состоит из метки и 2 кнопок. UserControl будет предоставлять такие свойства, как текст и события, которые отображаются для нажатий кнопок. Для каждой записи в списке вы будете создавать экземпляр UserControl, назначать текстовое значение и обрабатывать события нажатия. Экземпляр будет размещен на панели Таблица / Поток в правильном порядке. Обе эти панели макета позволяют вставлять элементы между другими элементами, чтобы вы могли динамически добавлять / удалять элементы из списка.

Edit: Учитывая длину того, что вы пытаетесь визуализировать, я бы подумал об использовании DataGridView и сделал бы некоторый пользовательский рендеринг, чтобы заставить его работать так, как вы хотите, чтобы он работал. Используя события рендеринга DGV, вы можете объединять столбцы, изменять цвета фона (например, выделение темно-серых линий), включать / выключать кнопки и обрабатывать изменение сетки в режиме редактирования для ваших строк, чтобы позволить изменение или вставку новых значений , Этот метод легко обрабатывает большие наборы данных, и вы можете легко связать их напрямую.

2 голосов
/ 04 декабря 2009

Что ж, это, конечно, похоже на кандидата для пользовательского компонента, который вы должны создать сами. Вы можете создать это, используя стандартные команды рисования .Net вместе с текстовым полем и обычным кнопочным управлением.

Теперь вы хотите узнать, с чего начать.

Создание проекта библиотеки управления Windows Forms. Вставьте текстовое поле и кнопку управления.

Код для рисования панели предпочтительно должен выполняться кодом. Это можно сделать с помощью обычных команд GDI +.

Edit:

Вот еще одна идея, которую я практически успешно использовал в своем собственном проекте.

Вы можете использовать элемент управления веб-браузера в приложении и отображать свои данные в виде HTML. Вы можете обновить источник элемента управления веб-браузера на основе ввода в текстовом поле, и щелкнув ссылки в элементе управления веб-браузера, вы получите событие, которое вы можете перехватить, чтобы выполнить какое-либо действие. Ваш CSS будет работать.

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

0 голосов
/ 04 декабря 2009

Используйте элемент управления WebBrowser и создайте в нем HTML-разметку, используя DocumentStream или DocumentText.

0 голосов
/ 04 декабря 2009

Вот как бы я это сделал:

Создать пользовательский элемент управления. В этом пользовательском элементе управления есть ListBox поверх LinkButton, и когда щелкается LinkButton, вы можете уступить его TextBox. В ListBoxes будет недоступен верхний ряд ... вы, вероятно, сможете получить остальное оттуда. Когда вы получите свой список слов, заполните Scrollable некоторого вида одним элементом управления для каждого слова:

(foreach String word in words){
   myScrollable.add(new MyComponent(word));
}

Оттуда я не уверен, что вы хотите сделать с полями или данными, но это моя первоначальная идея по настройке пользовательского интерфейса.

...