Astuce Silverlight : comment implémenter le Double Click - #S026

image 

Actuellement, Silverlight supporte la souris mais avec un seul click. Donc dans cette astuce nous allons voir comment implémenter le Double Clic. Vous pouvez appliquer cette technique à un contrôle individuel ou à toute votre page.

La clé de cette astuce est de lancer un timer DispatcherTimer lorsque l’événement click gauche de la souris est déclenché. Si un clic sur un autre bouton de la souris est intercepté avant la fin de l’interval de temps du double clic, il ne faut pas activer le double clic. Cet interval est généralement situé aux alentours des 200 millisecondes. Une fois que les 200 millisecondes sont passées, le timer doit être stoppé et désactivé jusqu’à qu’un autre clic sur la souris est intercepté.

Pour démarrer, créons notre timer et ajoutons un écouteur sur l’événement MouseLeftButtonDown. 

 DispatcherTimer _doubleClickTimer;
 Image _lastImage = null;
  
 public Page()
 {
     InitializeComponent();
    
     _doubleClickTimer = new DispatcherTimer();
     _doubleClickTimer.Interval = new TimeSpan(0, 0, 0, 0, 200);
     _doubleClickTimer.Tick += new EventHandler(DoubleClick_Timer);
  
     this.MouseLeftButtonDown += new MouseButtonEventHandler(Page_MouseLeftButtonDown);
 }
  
 // too much time has passed for it to be a double click.            
 void DoubleClick_Timer(object sender, EventArgs e)
 {
     _doubleClickTimer.Stop();
 }

Maintenant, dans la méthode Page_MouseLeftButtonDown(), on :

1. Vérifie que le timer est activé.

2. S’il l’est déjà, c’est que nous avons déjà cliqué une fois, nous avons donc fait un double clic.

3. Si le timer est désactivé, le démarrer.

  
void Page_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (_doubleClickTimer.IsEnabled)
    {
        // a double click has occured
        _doubleClickTimer.Stop();
 
        Image catImg = new Image();
        Uri uri = new Uri("cat.png", UriKind.Relative);
        ImageSource imgSource = new
            System.Windows.Media.Imaging.BitmapImage(uri);
        catImg.Source = imgSource; 
 
        catImg.SetValue(Canvas.LeftProperty,(double) e.GetPosition(LayoutRoot).X-90);
        catImg.SetValue(Canvas.TopProperty, (double)e.GetPosition(LayoutRoot).Y-113);
 
        if(null != _lastImage)
            MainCanvas.Children.Remove(_lastImage);
        
        MainCanvas.Children.Add(catImg);
        _lastImage = catImg;
 
    }
    else
    {
        _doubleClickTimer.Start();
    }
}

Voici une petite démonstration du code :

Syndication : Mike Snow’s Weblog
Traduction autorisée par Mike Snow.