Il existe un moyen plus simple que de gérer soi-même l'affichage du curseur ou d'utiliser Visual Studio pour construire de nombreux curseurs personnalisés.
Si vous avez un FrameworkElement, vous pouvez construire un curseur à partir de celui-ci en utilisant le code suivant :
public Cursor ConvertToCursor(FrameworkElement visual, Point hotSpot)
{
int width = (int)visual.Width;
int height = (int)visual.Height;
// Render to a bitmap
var bitmapSource = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
bitmapSource.Render(visual);
// Convert to System.Drawing.Bitmap
var pixels = new int[width*height];
bitmapSource.CopyPixels(pixels, width, 0);
var bitmap = new System.Drawing.Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
for(int y=0; y<height; y++)
for(int x=0; x<width; x++)
bitmap.SetPixel(x, y, Color.FromArgb(pixels[y*width+x]));
// Save to .ico format
var stream = new MemoryStream();
System.Drawing.Icon.FromHandle(resultBitmap.GetHicon()).Save(stream);
// Convert saved file into .cur format
stream.Seek(2, SeekOrigin.Begin);
stream.WriteByte(2);
stream.Seek(10, SeekOrigin.Begin);
stream.WriteByte((byte)(int)(hotSpot.X * width));
stream.WriteByte((byte)(int)(hotSpot.Y * height));
stream.Seek(0, SeekOrigin.Begin);
// Construct Cursor
return new Cursor(stream);
}
Notez que la taille de votre FrameworkElement doit être une taille de curseur standard (par exemple 16x16 ou 32x32), par exemple :
<Grid x:Name="customCursor" Width="32" Height="32">
...
</Grid>
Il serait utilisé comme ceci :
someControl.Cursor = ConvertToCursor(customCursor, new Point(0.5, 0.5));
Évidemment, votre FrameworkElement pourrait être un <Image>
si vous avez une image existante, ou vous pouvez dessiner ce que vous voulez en utilisant les outils de dessin intégrés de WPF.
Veuillez noter que des détails sur le format de fichier .cur peuvent être trouvés à l'adresse suivante ICO (format de fichier) .