Как расширить зону тестирования попаданий WPF для объекта Path - PullRequest
12 голосов
/ 15 апреля 2010

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

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

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

Будем весьма благодарны за любые предложения по расширению зоны испытания на удар.

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

Ответы [ 3 ]

7 голосов
/ 01 сентября 2011

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)

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

3 голосов
/ 02 апреля 2012

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

2 голосов
/ 07 января 2014

В 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, поэтому он отображается поверх.

...