Как расширить зону тестирования WPF для объекта Path
Тестирование Wpf-hit довольно хорошо, но единственный метод, который я нашел для расширения зоны атаки, - это создать прозрачную область заполнения вокруг вашего объекта. Я не могу найти какой-либо метод для добавления прозрачной области вокруг объекта Path. Путь очень тонкий, и я хотел бы включить проверку на попадание, если пользователь нажимает на путь. Я не могу найти какой-либо метод для расширения объекта пути с прозрачной областью, такой как изображение ниже:
alt text http://img175.imageshack.us/img175/6741/linepadding.png
Я попытался использовать частично прозрачную кисть, но я столкнулся с проблемой, описанной здесь: Как я могу нарисовать "soft" line в WPF (предположительно, используя LinearGradientBrush)?
Я также попытался поставить adorner над моей линией, но из-за алгоритмов сглаживания WPF, положение уходит, когда я увеличиваю масштаб и не мешаю другим атакам с ударами объектов плохой способ.
Любое предложение о расширении зоны тестирования хитов получило бы высокую оценку.
Спасибо,
Кумар
Ответы
Ответ 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, так что он отображается сверху.