Интерактивный рисунок в C # - PullRequest
1 голос
/ 24 ноября 2011

Мне нужно нарисовать большую интерактивную древовидную структуру в C # WinForms - корпоративную иерархию.

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

На первый взгляд, я мог бы создать гигантское изображение (или матрицу больших изображений) и использовать Graphics или BufferedGraphics для рендеринга небольшой области, заданной для увеличения масштаба пользователя.Это даст эффект масштабирования и панорамирования , который вы можете увидеть на Картах Google.

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

Следует ли мне избегать использования GDI и, возможно, использоватьDirectDraw вместо этого?Я не хочу переусердствовать - я просто хочу иметь возможность визуально представить структуру и дать пользователям возможность распечатать ее.

В качестве альтернативы, есть ли (бесплатная) библиотека, которая позволяет масштабировать ипанорамирование с интерактивностью?Я мог бы немного спросить, но, может быть, тот, который также может обрабатывать древовидные структуры?

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

Я только баловался с WPF.Я почти исключительно использую WinForms в .Net - есть ли в WPF что-то, что значительно облегчит эту задачу?

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

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

То, что вы не хотите хотите, это рисовать все на большом растровом изображении. Избегайте больших растровых изображений. : -)

Таким образом, либо вы используете графику с двойной буферизацией, предоставляемую фреймворком, либо разрабатываете ее самостоятельно. Это может быть не идеально, если вы хотите запустить приложение удаленно, однако: http://blogs.msdn.com/b/oldnewthing/archive/2006/01/03/508694.aspx

По сути, вы просто помещаете все, что хотите нарисовать, в список и обновляете его с точной информацией о том, где он закончился на экране, чтобы вы могли проверить его в OnMouseDown / OnMouseMove / OnMouseUp. Вскоре вы заметите необходимость сохранения перечисления, для которого находится состояние взаимодействия (например, DraggingObject, MakingSelection, Scrolling и т. Д.) И Point _lastMousePosition.

Логика довольно проста. Сделать его без мерцания и отзывчивым не может быть , что просто.

1 голос
/ 24 ноября 2011

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

Затем создайте еще один пользовательский элемент управления, в котором будут размещаться их и главный холст.Дайте ему холст (например, панель) и пару полос прокрутки.

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

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

...