DataGrid mit Mausrad scrollen

by St. Lange 2. September 2009 10:55

Mit Silverlight 3 wird nun endlich das Mausrad unterstützt. Über das MouseWheel Event bzw. durch Überschreiben von OnMouseWheel kann eine Silverlight Anwendung auf das Drehen des Mausrads reagieren. Dies ist sehr viel einfacher als noch in Silverlight 2, wo die einzige Möglichkeit zur Nutzung des Mausrads in der Weiterleitung von Browserevents über Javascript in die Silverlight Anwendung bestand.

Die Silverlight Standard Controls von Microsoft unterstützen jedoch weiterhin das Scrolling per Mausrad nicht. Dafür gibt es meines Erachtens keinen sinnvollen Grund, zumal Microsoft das Mausrad erfunden hat! Vermutlich ist diese Funktionalität dem engen Zeitplan von Silverlight 3 zum Opfer gefallen – man hatte wahrscheinlich keine Zeit mehr die schon in Silverlight 2 enthaltenen Controls zu überarbeiten. Es gibt zwar eine neue Klasse ScrollViewerExtensions, mit deren Hilfe man einen ScrollViewer elegant um MouseWheel Funktionalitäten erweitern kann, dass hilft einem aber nicht, wenn man einfach nur sein DataGrid mit dem Mausrad scrollen möchte.

Da es schwierig ist, einen Kunden einerseits mit den Vorzügen von Silverlight zu begeistern und ihm andererseits zu erklären, das die DataGrids in seiner schönen neuen Silverlight Anwendung leider nicht mit dem Mausrad durchgeblättert werden können, hier ein einfacher Workaround.

Der Trick besteht darin, das DataGrid über seine Automation Schnittstelle zum Scrollen zu bringen. Mit der Funktion OnCreateAutomationPeer holt man sich einen IScrollProvider und scrollt damit das DataGrid im MouseWheel Event. Da OnCreateAutomationPeer protected ist, muss eine eigene Klasse MouseWheelDataGrid von DataGrid abgeleitet werden, um die Funktion überhaupt aufzurufen zu können. Übrigens lässt sich in Silverlight auch über Reflection eine protected Funktion nicht aufrufen (was auch korrekt ist). Man muss daher von der Klasse DataGrid ableiten.

Hier der Quellcode von MouseWheelDataGrid:

namespace System.Windows.Controls
{
  public enum ScrollMode
  {
    None, Small, Large
  }

  public class MouseWheelDataGrid : DataGrid
  {
    public ScrollMode ScrollMode { get; set; }

    protected override void OnMouseWheel(MouseWheelEventArgs e)
    {
      if (ScrollMode == ScrollMode.None)
        base.OnMouseWheel(e);
      else
      {
        e.Handled = true;
        bool scrollUp = e.Delta < 0;
        ((IScrollProvider)OnCreateAutomationPeer()).Scroll(ScrollAmount.NoAmount, ScrollMode == ScrollMode.Small ?
          (scrollUp ? ScrollAmount.SmallIncrement : ScrollAmount.SmallDecrement) :
          (scrollUp ? ScrollAmount.LargeIncrement : ScrollAmount.LargeDecrement));
      }
    }
  }
}
 
kick it on dotnet-kicks.de

Tags:

Silverlight

Comments are closed

Powered by BlogEngine.NET 1.6.1.0 - Impressum