WPF Cursor на частично прозрачном изображении - PullRequest
7 голосов
/ 12 февраля 2010

У меня есть png, который содержит прозрачные области, и я установил его в тег изображения, но как я могу установить курсор на руку, когда он находится над непрозрачной частью изображения?

Спасибо Tony

1 Ответ

4 голосов
/ 13 февраля 2010

Для этого вам нужно взглянуть на само растровое изображение. Механизм тестирования попаданий в WPF считает, что любой пиксель, нарисованный с помощью «прозрачной» кисти, может быть кликабельным, хотя и невидимым. Обычно это хорошо, но мешает тому, что вы пытаетесь сделать. Так как .png рисует прозрачной кистью, весь .png считается нарисованным при тестировании удара.

Что вам нужно сделать в вашем MouseMove обработчике событий:

  1. Продолжайте и вызывайте проверку удара обычным способом.
  2. Для каждого HitTestResult, который вы получите, проверьте, является ли он Image, и если да, находится ли прозрачный пиксель под мышью
  3. Если вы получили удар по не-изображению или непрозрачному пикселю изображения, остановитесь.
  4. Выберите значение Cursor в зависимости от того, над чем находится мышь.

Чтобы определить, находится ли мышь над прозрачным пикселем изображения:

  1. Получить положение мыши относительно изображения (e.GetPosition(image))
  2. Если вы используете растяжение, вы должны выполнить обратный расчет растяжения в этой точке, чтобы получить индекс растрового изображения
  3. Используйте BitmapSource.CopyPixels для копирования 1-пиксельного прямоугольника в массив (т. Е. Только один пиксель, над которым находится мышь)
  4. Проверьте значение полученного пикселя, чтобы увидеть, является ли он прозрачным пикселем
...