ListBox Paging Mauszeiger anpassen Capability Detection Tool für Windows Phone (Teil 2)
Kommentare

Menü 2 für Experten: Mauszeiger anpassen
Unter Silverlight kann der Mauszeiger über jedes beliebige UI-Element anders dargestellt werden und bietet folgende Standardvarianten: Arrow, Eraser, Hand,

Menü 2 für Experten: Mauszeiger anpassen

Unter Silverlight kann der Mauszeiger über jedes beliebige UI-Element anders dargestellt werden und bietet folgende Standardvarianten: Arrow, Eraser, Hand, IBeam, SizeNS, SizeWE, Stylus und Wait. Diese werden dann bei einem UI-Element über die Cursor-Property definiert. Was jedoch, wenn ein eigener Mauszeiger verwendet werden soll?

Dazu schreibt man eine Hilfeklasse, die mittels Attached-Property das gewünschte UI-Element und ein DataTemplate erhält. Das DataTemplate soll dann für den Mauszeiger verwendet werden können. Listing 3 zeigt den Sourcecode für eine solche Hilfsklasse.

Listing 3: Die Hilfsklasse für die Mauszeigerdarstellung

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using System.Windows.Media;

namespace SilverlightCustomCursor
{
    public class CustomCursor
    {
        public static readonly DependencyProperty CustomCursorProperty =
            DependencyProperty.RegisterAttached("CustomCusor", typeof(CustomCursor), typeof(CustomCursor), null);

        private FrameworkElement _element;
        private Cursor _originalCursor;
        private Popup _cursorContainer;

        public CustomCursor(FrameworkElement element, DataTemplate dataTemplate)
        {
            _element = element;
            _element.SetValue(CustomCursorProperty, this);
            _originalCursor = _element.Cursor;
            _element.MouseMove += ElementOnMouseMove;
            _element.MouseLeave += ElementOnMouseLeave;
            _cursorContainer = new Popup
                                   {
                                       Child = new ContentControl
                                                   {
                                                       ContentTemplate = dataTemplate,
                                                       IsHitTestVisible = false,
                                                       RenderTransform = new TranslateTransform()
                                                   },
                                       IsHitTestVisible = false
                                   };
        }

        private void ElementOnMouseMove(object sender, MouseEventArgs e)
        {
            _element.Cursor = Cursors.None;

            _cursorContainer.IsOpen = true;
            var p = e.GetPosition(null);
            var t = (_cursorContainer.Child.RenderTransform as TranslateTransform);
            t.X = p.X;
            t.Y = p.Y;
        }

        private void ElementOnMouseLeave(object sender, MouseEventArgs e)
        {
            _element.Cursor = _originalCursor;

            _cursorContainer.IsOpen = false;
        }

        private void Dispose()
        {
            _element.MouseLeave -= ElementOnMouseLeave;
            _element.MouseMove -= ElementOnMouseMove;
            _element.ClearValue(CustomCursorProperty);
            _element.Cursor = _originalCursor;
            _cursorContainer.IsOpen = false;
            (_cursorContainer.Child as ContentControl).ContentTemplate = null;
            _cursorContainer.Child = null;
            _cursorContainer = null;
        }

        public static DataTemplate GetCursorTemplate(DependencyObject obj)
        {
            return (DataTemplate)obj.GetValue(CursorTemplateProperty);
        }

        public static void SetCursorTemplate(DependencyObject obj, DataTemplate value)
        {
            obj.SetValue(CursorTemplateProperty, value);
        }

        public static readonly DependencyProperty CursorTemplateProperty =
            DependencyProperty.RegisterAttached("CursorTemplate", typeof(DataTemplate), typeof(CustomCursor), new PropertyMetadata(OnCursorTemplatePropertyChanged));

        private static void OnCursorTemplatePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (!(d is FrameworkElement))
                throw new ArgumentOutOfRangeException("Property can only be attached to FrameworkElements");
            var element = (d as FrameworkElement);
            if (e.OldValue is DataTemplate)
            {
                (element.GetValue(CustomCursorProperty) as CustomCursor).Dispose();
            }
            if (e.NewValue is DataTemplate)
                new CustomCursor(element, e.NewValue as DataTemplate);
        }
    }
}  
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -