WPF Line, path .. и т. Д. Пользовательский стиль рисования - PullRequest
4 голосов
/ 29 октября 2009

В WPF есть способ, которым вы можете изменить способ рисования любого пути APART из Dash-Dot последовательностей? Скажем, я хочу нарисовать тройную линию для любого пути, который я рисую, или маленькие треугольники, волны ... и т. Д. На самом пути рисования. Я пробовал кисти, но это не будет следовать за Path. Пожалуйста, помогите

ТНХ

Ответы [ 2 ]

3 голосов
/ 19 января 2010

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

  1. Начните с PathGeometry.CreateFromGeometry(), чтобы получить PathGeometry для входного пути
  2. Используйте GetWidenedPathGeometry(), передавая желаемый интервал, чтобы получить новую геометрию, ребра которой соответствуют боковым линиям
  3. (необязательно) Удалите сегменты в конце расширенной геометрии, если необходимо
  4. Объедините геометрию боковой линии с исходной геометрией, используя CombinedGeometry
  5. Ударьте комбинированную геометрию, чтобы получить тройную линию

Дополнительные пояснения к шагу 3: расширенная геометрия имеет отрезки в конце исходной линии. Это приводит к тому, что линия проходит через конец вашей линии, что на самом деле выглядит эстетично во многих ситуациях. Если ваша ситуация выглядела бы лучше без нее, удалите ее, повторив геометрию боковой линии и удалив все отрезки, которые проходят через конечные точки исходного пути.

Приведенное выше занимает около 8 строк кода, если вы не зачеркиваете концы, или 15, если вы делаете это.

Хитрость, которая делает это удобным, заключается в создании присоединенного свойства, которое эффективно приводит в действие свойство Data элемента управления Path, к которому оно прикреплено. С таким прикрепленным свойством все, что вам нужно написать:

<Path TripleStroke.Enable="true" Data="..." />

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

Обновление

Базовый метод, который я описал выше, также может быть расширен, чтобы позволить произвольному шаблону быть примененным вдоль пути. Для примера, смотрите пользовательские кисти в инструменте Expression Design. Однако в WPF нет ничего встроенного, чтобы сделать это для вас, поэтому вам нужно создать его самостоятельно, и я могу сказать вам по опыту, что это большая работа. Вот основные шаги:

Сначала создайте метод, который принимает Geometry существующего Drawing и некоторые параметры для заглавных букв и т. Д. И создает новый Drawing, который повторяет заданный Drawing по пути, заданному Geometry , Затем легко нарисовать обведенный путь: создайте Drawing для описания пользовательского штриха, затем отобразите обводку, используя DrawingVisual, который содержит Binding с конвертером, который вызывает ваш метод преобразования.

Для реализации метода преобразования:

  1. Преобразование исходного чертежа в набор GeometryDrawing объектов (я также поддерживал ImageDrawing, но это сложнее, так как вам нужно использовать 3D-систему для растягивания изображений). Это делается путем повторения через DrawingGroup объектов, отслеживания преобразований по ходу и создания GeometryDrawings с соответствующим преобразованием.
  2. Удалите части геометрии в областях «заглушки» исходного чертежа и отложите их в сторону.
  3. Выполните итерацию по пути, многократно дублируя объекты GeometryDrawing с соответствующими преобразованиями координат, примененными ко всем координатам в геометрии.
  4. Обработать разделы "торцевых крышек" геометрии, используя ту же процедуру.

Также обратите внимание на шаге 1, что любые GlyphRunDrawings обрабатываются с помощью FormattedText.BuildGeometry, чтобы создать эквивалент GeometryDrawing.

0 голосов
/ 19 января 2010

Нет поддерживаемого метода для этого в WPF. Решение будет включать либо составные объекты Path, либо модную гимнастику с выделенным кодом. Вы конкретно ищете реализацию пути из трех строк?

...