Построение изображений в C # WPF / MVVM (рисование линий, дуг, текста) - PullRequest
1 голос
/ 21 декабря 2010

В автономном приложении WPF мне нужно нарисовать изображение на основе серии «команд», таких как «текст a в позиции x, y» и «нарисовать линию от x1, y1 до x2, y2».

Мои проблемы и соображения изложены ниже - любая помощь и комментарии наиболее ценны!

  • Изображение представляет собой водяной насос, построенный нашей компанией.

  • Команды генерируются собственной системой нашей компании.

  • Нет проблем при интерпретации команд.

  • У меня проблема с

    a) какой элемент управления WPF выбрать, чтобы он был «включен»?

    b) как я могу переместить основную частькод для юнит-тестируемых классов?

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

    a2) Я пробовалс Shape, который поддерживает рисование текста, но менее продвинут в отношении геометрии.

    a3) Могу ли я использовать thсила в каждом из двух, и «применить» PathGeometry к Shape?

    a4) Мне нужно обработать MouseOver после рисования, чтобы выделить на основе положения мыши.Это можно сделать, посчитав «за кулисами» ближайшую позицию мыши объекта (хотя это возможно, это тяжело!), Но может ли мне помочь выбор управления рендерингом?

    b1) Я не ожидаю окончания рисованиябыть подлежащим тестированию?

    b2) Насколько «глубоким» я должен ссылаться на элементы управления, принадлежащие к GUI?Чувство интуиции говорит не глубже, чем ViewModel (не бизнес-уровень), но чем выше я его держу, тем больше кода остается в местах, где они не могут быть проверены модулем.

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

Вот ответы, специфичные для WPF:

Вы можете рисовать на Canvas , который позволяет вам установить позицию элемента (Canvas.SetLeft, Canvas.SetTop, ...)

И вы можете прекрасно использовать PathGeometry, Shape и т. Д ... у вас также должен быть цикл в GeometryGroup , который позволяет группировать всю геометрию в одно целое.

Для текста, если вы хотите использовать текст в качестве геометрии, вы можете использовать FormattedText с методом BuildGeometry ..

0 голосов
/ 24 декабря 2010

О модульном тестировании.

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

Вместо этого вы можете использовать подход "пассивного просмотра" .Вы определяете независимый от управления интерфейс виртуальной машины для своего представления.Что-то вроде

interface IView
{
   void AddLine(int x1, int y1, int x2, int y2);
   void DrawText(...);
}

Ваша точка зрения должна иметь простую реализацию этого интерфейса с минимальной логикой: каждый метод имеет максимум 2-3 строки, без условий или циклов.Это «тупой» пассивный вид, который нельзя проверить.

Остальная часть системы (а именно Presenter) общается с интерфейсом IView и ничего не знает о WPF или элементах управления.Ну, для удобства он может использовать некоторые простые типы WPF, такие как Color или Rectangle.

Вы можете использовать библиотеку макетов (например, Rhino Mocks) для написания тестов, которые удостоверяются, что ваш Presenter делает правильные вызовы для вашего пассивного представления.Вы создаете «фиктивный» вид и передаете его докладчику.

...