lundi 21 avril 2008

Utilisation d'un Timer en Silverlight 2

L'utilisation d'un timer est souvent utile pour déclencher des actions aprés un temps donné. Dans cette exemple vous trouverez comment masquer des élements de votre vue aprés une inactivité de la souris de 2 secondes.

Nous allons créer un rectangle bleu portant le nom "rRectangle".

<UserControl x:Class="SilverlightApplication1.Page"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<Rectangle x:Name="rRectangle" Width="100" Height="100" Fill="Blue" />
</Grid>
</UserControl>


Tout dabord dans l'initialisation de votre UserControl il faut s'abonner à l'évenement du mouvement de la souris :



namespace SilverlightApplication1
{
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
this.MouseMove += new MouseEventHandler(Page_MouseMove);
}

void Page_MouseMove(object sender, MouseEventArgs e)
{
throw new NotImplementedException();
}
}
}


A chaque fois que l'on bouge la souris la fonction Page_MouseMove est appelé. Il faut stocké le DateTime actuel.



public partial class Page : UserControl
{
private DateTime _lastMove = DateTime.Now;
public Page()
{
InitializeComponent();
this.MouseMove += new MouseEventHandler(Page_MouseMove);
}

void Page_MouseMove(object sender, MouseEventArgs e)
{
_lastMove = DateTime.Now;
}
}


Maintenant nous allons créer un Timer en utilisant la classe System.Windows.Threading.DispatcherTimer, en définissant un interval de 2 secondes.



public partial class Page : UserControl
{
private DateTime _lastMove = DateTime.Now;
public Page()
{
InitializeComponent();
this.MouseMove += new MouseEventHandler(Page_MouseMove);
System.Windows.Threading.DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer();
dt.Interval = new TimeSpan(0, 0, 2);
dt.Tick += new EventHandler(dt_Tick);
dt.Start();
}

void dt_Tick(object sender, EventArgs e)
{
throw new NotImplementedException();
}

void Page_MouseMove(object sender, MouseEventArgs e)
{
_lastMove = DateTime.Now;
}
}


La fonction dt_Tick est donc appelée toutes les deux secondes.

Nous allons donc comparer le DateTime actuel avec le _lastMove stocké si la différence est supérieur a deux secondes on masque le rectangle et lorsque l'on bouge la souris on affiche le rectangle.



public partial class Page : UserControl
{
private DateTime _lastMove = DateTime.Now;
public Page()
{
InitializeComponent();
this.MouseMove += new MouseEventHandler(Page_MouseMove);
System.Windows.Threading.DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer();
dt.Interval = new TimeSpan(0, 0, 2);
dt.Tick += new EventHandler(dt_Tick);
dt.Start();
}

void dt_Tick(object sender, EventArgs e)
{
DateTime diff = DateTime.Now - _lastMove;
if (diff.Second > 2)
{
rRectangle.Visibility = Visibility.Collapsed;
}
}

void Page_MouseMove(object sender, MouseEventArgs e)
{
_lastMove = DateTime.Now;
rRectangle.Visibility = Visibility.Visible;
}
}


Voila si l'on lance l'application et que la souris reste immobile pendant plus de deux sedondes le rectangle disparaitra et lorsque l'on éffectuera un mouvement avec la souris celui ci réapparaitra.

Aucun commentaire: