Для этого вам нужно взглянуть на само растровое изображение. Механизм тестирования попаданий в WPF считает, что любой пиксель, нарисованный с помощью «прозрачной» кисти, может быть кликабельным, хотя и невидимым. Обычно это хорошо, но мешает тому, что вы пытаетесь сделать. Так как .png рисует прозрачной кистью, весь .png считается нарисованным при тестировании удара.
Что вам нужно сделать в вашем MouseMove
обработчике событий:
- Продолжайте и вызывайте проверку удара обычным способом.
- Для каждого
HitTestResult
, который вы получите, проверьте, является ли он Image
, и если да, находится ли прозрачный пиксель под мышью
- Если вы получили удар по не-изображению или непрозрачному пикселю изображения, остановитесь.
- Выберите значение
Cursor
в зависимости от того, над чем находится мышь.
Чтобы определить, находится ли мышь над прозрачным пикселем изображения:
- Получить положение мыши относительно изображения (
e.GetPosition(image)
)
- Если вы используете растяжение, вы должны выполнить обратный расчет растяжения в этой точке, чтобы получить индекс растрового изображения
- Используйте
BitmapSource.CopyPixels
для копирования 1-пиксельного прямоугольника в массив (т. Е. Только один пиксель, над которым находится мышь)
- Проверьте значение полученного пикселя, чтобы увидеть, является ли он прозрачным пикселем