В классах Geometry
WPF есть все примитивы, которые вам нужны для легкого выполнения этого, но вам придется делать это в коде. Когда мне нужно сделать пользовательские линии, я обычно строю Drawing
на основе Geometry
, но в вашем случае вы можете просто построить Geometry
, который имеет три параллельные линии и обводить их.
- Начните с
PathGeometry.CreateFromGeometry()
, чтобы получить PathGeometry
для входного пути
- Используйте
GetWidenedPathGeometry()
, передавая желаемый интервал, чтобы получить новую геометрию, ребра которой соответствуют боковым линиям
- (необязательно) Удалите сегменты в конце расширенной геометрии, если необходимо
- Объедините геометрию боковой линии с исходной геометрией, используя
CombinedGeometry
- Ударьте комбинированную геометрию, чтобы получить тройную линию
Дополнительные пояснения к шагу 3: расширенная геометрия имеет отрезки в конце исходной линии. Это приводит к тому, что линия проходит через конец вашей линии, что на самом деле выглядит эстетично во многих ситуациях. Если ваша ситуация выглядела бы лучше без нее, удалите ее, повторив геометрию боковой линии и удалив все отрезки, которые проходят через конечные точки исходного пути.
Приведенное выше занимает около 8 строк кода, если вы не зачеркиваете концы, или 15, если вы делаете это.
Хитрость, которая делает это удобным, заключается в создании присоединенного свойства, которое эффективно приводит в действие свойство Data
элемента управления Path
, к которому оно прикреплено. С таким прикрепленным свойством все, что вам нужно написать:
<Path TripleStroke.Enable="true" Data="..." />
Если вы знаете, как реализовывать вложенные свойства и регистрировать в них обработчики, это очень просто. Если нет, то планируйте потратить несколько часов на изучение того, как кодировать вложенные свойства для имитации приведения значений перед реализацией подхода с присоединенными свойствами.
Обновление
Базовый метод, который я описал выше, также может быть расширен, чтобы позволить произвольному шаблону быть примененным вдоль пути. Для примера, смотрите пользовательские кисти в инструменте Expression Design. Однако в WPF нет ничего встроенного, чтобы сделать это для вас, поэтому вам нужно создать его самостоятельно, и я могу сказать вам по опыту, что это большая работа. Вот основные шаги:
Сначала создайте метод, который принимает Geometry
существующего Drawing
и некоторые параметры для заглавных букв и т. Д. И создает новый Drawing
, который повторяет заданный Drawing
по пути, заданному Geometry
, Затем легко нарисовать обведенный путь: создайте Drawing
для описания пользовательского штриха, затем отобразите обводку, используя DrawingVisual
, который содержит Binding
с конвертером, который вызывает ваш метод преобразования.
Для реализации метода преобразования:
- Преобразование исходного чертежа в набор
GeometryDrawing
объектов (я также поддерживал ImageDrawing
, но это сложнее, так как вам нужно использовать 3D-систему для растягивания изображений). Это делается путем повторения через DrawingGroup
объектов, отслеживания преобразований по ходу и создания GeometryDrawings с соответствующим преобразованием.
- Удалите части геометрии в областях «заглушки» исходного чертежа и отложите их в сторону.
- Выполните итерацию по пути, многократно дублируя объекты
GeometryDrawing
с соответствующими преобразованиями координат, примененными ко всем координатам в геометрии.
- Обработать разделы "торцевых крышек" геометрии, используя ту же процедуру.
Также обратите внимание на шаге 1, что любые GlyphRunDrawings
обрабатываются с помощью FormattedText.BuildGeometry
, чтобы создать эквивалент GeometryDrawing
.