WPF, Налаштування ліній

Наконечники та стики ліній

При малюванні фігур Line і Polyline можна вказати форму початкової та кінцевої точок лінії, використовуючи властивостіStrokeStartLineCap таStrokeEndLineCap. (Ці властивості не мають ефекту в інших фігурах, оскільки замкнуті.)

Спочатку властивості StrokeStartLineCap і StrokeEndLineCap встановлені Flat, що означає негайне завершення лінії в її кінцевих координатах. До інших можливих варіантів відносяться Round (лінія м'яко заокруглюється), Triangle (обидві сторони лінії зводяться в крапку) та Square (лінія завершується чітким кордоном). Всі ці значення додають лінії довжину — тобто виводять її за ту позицію, в якій вона закінчилася б інакше. Додаткова відстань становить половину товщини лінії.

Єдина відмінність між Flat і Square полягає в тому, що лінії, що завершуються як Square, просто на половину товщини довші з кожного боку. У решті відносин вони виглядають однаково.

Нижче показані різні варіанти кінців ліній:

налаштування

Усі фігури, крім Line, дозволяють змінювати вигляд і форму кутів через властивістьStrokeLineJoin. Тут існує три варіанти: Miter (значення за умовчанням) використовує чіткі грані, Bevel обрізає кут у точці сполучення, a Round - плавно заокруглює його. На малюнку можна побачити різницю між ними:

налаштування

При використанні граней Miter при товстих лініях і малих кутах може вийти, що кут перевищує половину товщини лінії. Якщо ви встановите товщину 3, то кут, що виступає, може в півтора рази перевищувати товщину лінії. В останній лінії малюнку використовується велике значення загострення з вузьким кутом.

Пунктирні лінії

Замість малювання нудних суцільних лінійна межі вашої фігури можна використовувати пунктирні (dashed) лінії - тобто. лінії, що перериваються пробілами відповідно до вказаного шаблону.

При створенні пунктирної лінії WPF ви не обмежені певним набором жорстко заданих варіантів. Натомість можна вибирати довжину суцільного сегмента і довжину перерваного сегмента (пробілу), встановлюючи властивістьStrokeDashArray.

Наприклад, розглянемо таку лінію:

Тут задана довжина суцільного сегмента – 1 та ширина пробілу – 2. Ці значення інтерпретуються щодо товщини лінії. Тому якщо лінія має товщину 14 одиниць (як у даному прикладі), то суцільна частина матиме довжину 14 одиниць, а ширина пропуску - 28. Лінія повторює цей шаблон протягом усієї своєї довжини.

З іншого боку, якщо поміняти місцями ці значення, поставивши їх так:

то вийде лінія з довжиною суцільної ділянки 28 одиниць і шириною пропуску 14 одиниць. На малюнку показано обидві лінії. Неважко помітити, що коли сегмент дуже товстої лінії посідає кут, він може бути обрізаний нерівно:

налаштування

Можна також використовувати нецілочисленні значення. Наприклад, наступне значення StrokeDashArray цілком припустимо:

Тут застосовується більш складна послідовність - штрих довжиною 5x14, потім пропуск шириною 0.2x14, за яким йде штрих довжиною 3x14 і ще один - довжиною 0.2x14. Наприкінці цієї послідовності лінія повторює той самий шаблон спочатку.

Цікава річ відбувається, коли StrokeDashArray передається непарна кількість значень. Розглянемо приклад:

При малюванні цієї лінії WPF починає з лінії довжиною 3 товщини, за якою слідує пробіл в половину товщини лінії, за яким йде штрих довжиною 2 товщини. Але коли шаблон повторюється, він починається зпробілу в 3 товщини, за ним йде лінія завдовжки половину товщини і знову пробіл. По суті, пунктирна лінія чергує шаблони між сегментами лінії та пробілами.

Якщо потрібно, щоб шаблон пунктирної лінії починався з його середини, можна застосувати властивістьStrokeDashOffset, яка являє собою індекс, що починається з О, що вказує на одне зі значень з StrokeDashArray. Наприклад, якщо встановити StrokeDashOffset рівним 1 попередньому прикладі, то лінія почнеться з пробілу в половину товщини. Встановіть 2 - і лінія почнеться з сегмента 2 товщини.

І, нарешті, можна керувати зовнішнім виглядом наконечників сегментів лінії. Спочатку вони малюються як прямий зріз, але можна встановити значенняStrokeDashCap у Bevel, Square та Triangle — зміст цих значень розглядався у попередньому розділі. Не забувайте, що всі ці установки додають половину товщини лінії в кінець кожного штриха. Якщо не взяти до уваги, можна отримати штрихи, які "наповзають" один на одного. Рішення полягає у додаванні ширини пробілу, щоб компенсувати цей ефект.

При використанні властивості StrokeDashCap з лінією (але не з фігурою) часто є сенс встановити StartLineCap і EndLineCap в те саме значення. Це зробить зовнішній вигляд лінії узгодженим.