WPF Cursor on a partially transparent image WPF Cursor on a partially transparent image wpf wpf

WPF Cursor on a partially transparent image


To do this you will need to look at the bitmap itself. WPF's hit testing mechanism considers any pixel painted ith a "transparent" brush to still be clickable even though invisible. This is normally a good thing but gets in the way of what you're trying to do. Because a .png paints with the transparent brush, the entire .png is considerd as painted when doing hit testing.

What you need to do in your MouseMove event handler is:

  1. Go ahead and invoke hit testing the normal way.
  2. For each HitTestResult you get back, check to see if it is an Image and if so, whether a transparent pixel is under the mouse
  3. When you get a hit on a non-image or a non-transparent pixel of an image, stop.
  4. Decide on a Cursor value based on what the mouse is over

To determine whether a the mouse is over a transparent pixel of an image:

  1. Get the mouse position relative to the image (e.GetPosition(image))
  2. If you're using stretching you must back-compute the stretch at this point to get a bitmap index
  3. Use BitmapSource.CopyPixels to copy a 1-pixel rectangle into an array (ie. only the single pixel the mouse is over)
  4. Check the pixel value that was retrieved to see if it is a transparent pixel