Подтвердить что ты не робот

Как расширить зону тестирования WPF для объекта Path

Тестирование Wpf-hit довольно хорошо, но единственный метод, который я нашел для расширения зоны атаки, - это создать прозрачную область заполнения вокруг вашего объекта. Я не могу найти какой-либо метод для добавления прозрачной области вокруг объекта Path. Путь очень тонкий, и я хотел бы включить проверку на попадание, если пользователь нажимает на путь. Я не могу найти какой-либо метод для расширения объекта пути с прозрачной областью, такой как изображение ниже: alt text http://img175.imageshack.us/img175/6741/linepadding.png

Я попытался использовать частично прозрачную кисть, но я столкнулся с проблемой, описанной здесь: Как я могу нарисовать "soft" line в WPF (предположительно, используя LinearGradientBrush)?

Я также попытался поставить adorner над моей линией, но из-за алгоритмов сглаживания WPF, положение уходит, когда я увеличиваю масштаб и не мешаю другим атакам с ударами объектов плохой способ.

Любое предложение о расширении зоны тестирования хитов получило бы высокую оценку.

Спасибо, Кумар

4b9b3361

Ответ 1

Path.Data - объект геометрии. Класс Geometry имеет несколько методов, которые могут помочь вам выполнить тест с допуском:

GetFlattenedPathGeometry(Double, ToleranceType)
GetOutlinedPathGeometry(Double, ToleranceType)
GetRenderBounds(Pen, Double, ToleranceType)

Я думаю, что GetRenderBounds будут работать лучше всего для вас.

Как только у вас есть геометрия (плюс небольшая ширина), вы можете вызвать

geometry.FillContains(Point, Double, ToleranceType)

или

geometry.StrokeContains(Pen, Point, Double, ToleranceType)

Из всего этого вы должны настроить желаемый удар из теста на попадание;

Ответ 2

Вы можете обернуть путь внутри прозрачного Border.

Ответ 3

В WPF вы можете создать другой путь с привязкой к геометрии геометрии к первому (используя привязку элементов), но с прозрачной кистью и увеличенной толщиной.

Что-то более или менее похожее:

<Path x:Name="backPath" Data="{Binding Data, ElementName=mainPath}" StrokeThickness="10" Stroke="Transparent"/>
<Path x:Name="mainPath" Data="{Binding DataFromViewModel}" StrokeThickness="1" Stroke="Red"/>

Обратите внимание, что основной путь приходит в XAML, так что он отображается сверху.