Scrolling di una ListBox con la rotellina del mouse in Silverlight 2.0

di Alessio Leoncini, in Silverlight 2.0,

Il controllo ListBox consente la renderizzazione di un elenco di oggetti ed include una funzionalità di scrolling qualora l'ingombro degli elementi superi le dimensioni assegnate al controllo.

All'occorrenza un ListBox può renderizzare le barre di scorrimento orizzontale e verticale includendo un controllo ScrollViewer e aggiungendo le funzionalità di scrolling del tutto simili alle analoghe del sistema operativo, ad eccezione del supporto per la rotellina del mouse.

In Silverlight non sono esposti nativamente gli eventi di scrolling della rotellina del mouse, per la
loro gestione è necessario agganciarsi agli eventi onmousewheel ed analoghi esposti attraverso il DOM della pagina HTML.

Il codice per la completa gestione di questi eventi richiede una certa attenzione affinchè sia compatibile con tutte le versioni dei browser supportati; in rete si possono trovare molte implementazioni di librerie specifiche, la più interessante è quella inclusa nei progetti del DeepZoomComposer, il cui codice si può trovare nel file MouseWheelHelper.cs del progetto allegato.

Per aggiungere la gestione dello scrolling con la rotella del mouse è utile realizzare un controllo personalizzato estendendo il ListBox:

public class MouseWheelListBox : ListBox
{
   public MouseWheelListBox() { }

   public ScrollViewer ScrollViewer
   {
      get
      {
         return this.GetTemplateChild("ScrollViewer") as ScrollViewer;
      }
   }
}

Tale operazione è necessaria per rendere accessibile lo ScrollViewer direttamente come proprietà del controllo stesso, in modo da poter effettuare lo scrolling in funzione delle informazioni inviate dalla rotella del mouse.

Attraverso l'oggetto MouseWheelHelper è possibile gestire l'evento Moved scatenato dalla rotellina del mouse.
Eseguendo un'istanza di questo oggetto nel costruttore del MouseWheelListBox è possibile recuperare il delta di spostamento attraverso il parametro MouseWheelEventArgs passato al delegate corrispondente all'evento:

public class MouseWheelListBox : ListBox
{
   public MouseWheelListBox()
   {
      new MouseWheelHelper(this).Moved += delegate(object sender, MouseWheelEventArgs e)
      {
         e.Handled = true;

         double delta = this.ScrollViewer.VerticalOffset - e.Delta;

         if (delta > this.ScrollViewer.ScrollableHeight)
         {
            delta = this.ScrollViewer.ScrollableHeight;
         }
         else if (delta < 0)
         {
            delta = 0;
         }
         this.ScrollViewer.ScrollToVerticalOffset(delta);
      };
   }

   public ScrollViewer ScrollViewer
   {
      get
      {
         return this.GetTemplateChild("ScrollViewer") as ScrollViewer;
      }
   }
}

Dopo gli opportuni controlli, il delta di spostamento viene utilizzato dal metodo
ScrollToVerticalOffset dello ScrollViewer in modo da attivare l'effettivo scrolling del ListBox.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Nessuna risorsa collegata

I più letti di oggi