Wednesday, November 18, 2009

Reemplazar Cursor con UIElement

He creado un pequeño metodo para reemplazar el cursor de una ventana con un UIElement de WPF:

using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
 
namespace SDKSamples
{
    public static class WPFCursor
    {
        public static void ReplaceCursor(this Window wnd, UIElement cursor)
        {
            wnd.Cursor = Cursors.None;
            Grid cursorHostContainer = wnd.Content as Grid;
            if (cursorHostContainer == null) return;
 
            Canvas host = new Canvas();
            host.IsHitTestVisible = false;
            Canvas.SetZIndex(cursor, int.MaxValue);
            cursorHostContainer.Children.Add(host);
            host.Children.Add(cursor);
 
            wnd.MouseMove += (s, e) =>
                {
                    var absoluteWindowMousePosition = e.GetPosition(wnd);
                    Canvas.SetTop(cursor, absoluteWindowMousePosition.Y);
                    Canvas.SetLeft(cursor, absoluteWindowMousePosition.X);
                };
            wnd.MouseEnter += (s, e) =>
                {
                    cursor.Visibility = Visibility.Visible;
                };
            wnd.MouseLeave += (s, e) =>
                {
                    cursor.Visibility = Visibility.Collapsed;
                };
        }
    }
}

Espero les sirva, se usa de la siguiente forma en el constructor de la ventana a la cual le necesitamos reemplazar el cursor, en este ejemplo mi nuevo cursor sera una instancia de un UserControl llamado MySuperCursor.

   1: public MainWindow()
   2: {
   3:     InitializeComponent();
   4:     this.ReplaceCursor(new MySuperCursor());
   5: }

Por ultimo, el unico requerimiento que tiene es que la ventana tenga un Grid como elemento contenido principal:

   1: <Window x:Class="SDKSamples.Window2"
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     Title="Window2" Height="300" Width="300">
   5:     <Grid>
   6:     </Grid>
   7: </Window>

he aqui un screenshot:

image

2 comments:

Anonymous said...

Excelente mi joven padawan, recuerda lo que hablamos vía MSN...

Saludos,

Angel

Johan Hernandez said...

Estoy en eso :)