Используя перегруженную функцию VisualTreeHelper.HitTest()
, где вы можете указать HitTestParameters
: используйте геометрию прямоугольника с центром в pt
(но больше одной точки), переданную с GeometryHitTestParameters
:
var hitRect = new Rect(x - 2, y - 2, 4, 4);
VisualTreeHelper.HitTest(drawing, null, null,
new GeometryHitTestParameters(new RectangleGeometry(hitRect)));
Обратите внимание, что в этом примере мы используем прямоугольную геометрию, но лучшим приближением (особенно для сенсорных экранов) является круг (EllipseGeometry
).
Теперь вы знаете, что вызывать, но вам нужен результат, эта перегрузка не имеет возвращаемого значения, вместо этого она использует функцию обратного вызова, где вы можете накапливать несколько попаданий (выбирать одно по более сложным правилам). В нашем примере он нам не нужен, поэтому мы просто останавливаемся при первом попадании:
bool result = false;
var hitRect = new Rect(x - 2, y - 2, 4, 4);
VisualTreeHelper.HitTest(drawing, null,
htr => { result = true; return HitTestResultBehavior.Stop; },
new GeometryHitTestParameters(new RectangleGeometry(hitRect)));
Обратите внимание, что вы даже можете напрямую выполнить код:
htr => {
MessageBox.Show("You clicked on the line!");
return HitTestResultBehavior.Stop;
},
Если вы используете его часто, вы можете написать для этого более общий метод (например, с необязательным параметром для размера прямоугольника).
Если вы просто не хотите знать, есть ли попадание или нет (но вы также хотите знать, какой объект), вы можете использовать вторую функцию обратного вызова (HitTestResultCallback
), ее параметр (тот, что называется htr
в моем предыдущем примере) класс, производный от HitTestResult
< /a> и даже в базовом классе есть свойство с именем VisualHit
, который является визуальным объектом (как общий DependencyObject
, тогда вам может понадобиться приведение), который вы ищете.
person
Adriano Repetti
schedule
09.09.2014
VisualTreeHelper.HitTest
, где вы можете указатьHitTestParameters
, используйте геометрию прямоугольника с центром вpt
, но больше, чем одна точка, переданная сGeometryHitTestParameters
:VisualTreeHelper.HitTest(drawing, null, null, new GeometryHitTestParameters(...))
. - person Adriano Repetti   schedule 10.09.2014...
наnew RectangleGeometry(new Rect(x - 2, y - 2, 4, 4))
. Ну... для примера. Прямоугольник является самым простым, но, особенно если вы планируете использовать свое приложение с сенсорным экраном, круг лучше представляет большую область проверки попадания. - person Adriano Repetti   schedule 10.09.2014