Traduction

Ce tutoriel est la traduction la plus fidèle possible du tutoriel original de Peter Bull, Microsoft Silverlight 4 - Silverlight Analogue Clock with Alarm.

Introduction

Alarm Clock fait usage d'un contrôle utilisateur Silverlight pour réaliser une horloge analogique qui affiche l'heure et les paramètres d'alarme afin de créer un réveil simple.

Horloge analogique avec alarme en Silverlight

Étape 1

Démarrez Microsoft Visual Web Developer 2010 Express, ensuite sélectionnez Fichier puis Nouveau Projet... Sélectionnez Visual Basic ensuite Application Silverlight dans les modèles installés, sélectionnez un emplacement si vous le souhaitez, puis entrez un nom pour le projet et appuyez sur OK :

Image non disponible

Étape 2

Une nouvelle fenêtre Nouvelle application Silverlight devrait apparaître, décochez la case Héberger l'application Silverlight sur un nouveau site Web, puis sélectionnez la Version de Silverlight ciblée :

Image non disponible

Étape 3

Une page vierge nommée MainPage.xaml devrait alors apparaître :

Image non disponible

Étape 4

Sélectionnez Projet ensuite Ajouter un nouvel élément..., et sélectionnez le modèle Contrôle utilisateur Silverlight s'il ne l'est pas déjà, ensuite changez le Nom à Clock.xaml :

Image non disponible

Étape 5

Ajoutez le nouveau contrôle utilisateur au Projet en cliquant sur Ajouter, ensuite dans le volet XAML pour le contrôle utilisateur Clock.xaml, pour la balise <UserControl> modifiez les attributs DesignHeight et DesignWidth à 250 :

Image non disponible

Étape 6

Retournez dans le concepteur de vues pour Clock en sélectionnant l'onglet Clock.xaml.

Puis dans la section Tous les contrôles Silverlight de la Boîte à outils, sélectionnez le contrôle Canvas :

Image non disponible

Étape 7

Dessinez un Canvas sur la page, ensuite dans le volet XAML, au-dessus de </Grid> modifiez la ligne Canvas1 comme ceci :

 
Sélectionnez
<Canvas Height="250" Width="250" Name="Display"/>

Voir ci-dessous :

Image non disponible

Étape 8

Faites un clic droit sur la page ou sur l'entrée pour Clock.xaml dans l'Explorateur de solutions et choisissez l'option Afficher le code. Dans la vue de code, en dessous de la ligne Inherits UserControl tapez les déclarations suivantes :

 
Sélectionnez
Private ReadOnly COLOR_TOMATO As Color = Color.FromArgb(255, 255, 99, 71)
Private ReadOnly COLOR_GAINSBORO As Color = Color.FromArgb(255, 220, 220, 220)
Private ReadOnly COLOR_WHITESMOKE As Color = Color.FromArgb(255, 245, 245, 245)
Private ReadOnly COLOR_ROYALBLUE As Color = Color.FromArgb(255, 65, 105, 225)

Private WithEvents _timer As New Windows.Threading.DispatcherTimer
Private _time As DateTime = Now
Private _alarm As DateTime
Private _markers As New Canvas
Private _face As New Canvas
Private _secondsHand As Rectangle
Private _minutesHand As Rectangle
Private _hoursHand As Rectangle
Private _alarmMinutesHand As Rectangle
Private _alarmHoursHand As Rectangle
Private _diameter As Double
Private _secondsWidth As Integer = 1
Private _secondsHeight As Integer
Private _minutesWidth As Integer = 5
Private _minutesHeight As Integer
Private _hoursWidth As Integer = 8
Private _hoursHeight As Integer
Private _alarmMinutesWidth As Integer = 5
Private _alarmMinutesHeight As Integer
Private _alarmHoursWidth As Integer = 8
Private _alarmHoursHeight As Integer
Private _isEnabled As Boolean = True
Private _isRealTime As Boolean = True
Private _showSeconds As Boolean = True
Private _showMinutes As Boolean = True
Private _showHours As Boolean = True
Private _showAlarm As Boolean = True
Private _hasAlarm As Boolean = False
Private _faceColour As Color = COLOR_ROYALBLUE
Private _rimColour As Color = Colors.Blue
Private _markerColour As Color = Colors.White
Private _secondColour As Color = COLOR_TOMATO
Private _minuteColour As Color = COLOR_GAINSBORO
Private _hourColour As Color = COLOR_WHITESMOKE
Private _alarmColour As Color = Colors.Orange

Public Event Triggered()
Image non disponible
Image non disponible

Étape 9

Pendant que nous en sommes à la vue de code pour le contrôle utilisateur Clock, au-dessus du Public Sub New() de Partial Public Class Clock, tapez les fonctions suivantes :

 
Sélectionnez
Private Function Hand(ByRef Width As Double, ByRef Height As Double, _
    ByRef Background As Brush, ByRef Foreground As Brush, _
    ByRef RadiusX As Double, ByRef RadiusY As Double, _
    ByRef Thickness As Double)
  Dim _hand As New Rectangle
  _hand.Width = Width
  _hand.Height = Height
  _hand.Fill = Background
  _hand.StrokeThickness = Thickness
  _hand.RadiusX = RadiusX
  _hand.RadiusY = RadiusY
  _hand.Stroke = Foreground
  Return _hand
End Function

Private Function TransformGroup(ByRef Angle As Double, _
    ByRef X As Double, ByRef Y As Double) As TransformGroup
  Dim _transformGroup As New TransformGroup
  Dim _firstTranslate As New TranslateTransform
  _firstTranslate.X = X
  _firstTranslate.Y = Y
  _transformGroup.Children.Add(_firstTranslate)
  Dim _rotateTransform As New RotateTransform
  _rotateTransform.Angle = Angle
  _transformGroup.Children.Add(_rotateTransform)
  Dim _secondTranslate As New TranslateTransform
  _secondTranslate.X = _diameter / 2
  _secondTranslate.Y = _diameter / 2
  _transformGroup.Children.Add(_secondTranslate)
  Return _transformGroup
End Function
Image non disponible

Étape 10

Toujours dans le vue de code pour le contrôle utilisateur Clock, au-dessus du Public Sub New() de Partial Public Class Clock et en dessous des fonctions, tapez les Subs suivants :

 
Sélectionnez
Private Sub SecondHand(ByVal Seconds As Integer)
  If _secondsHand IsNot Nothing AndAlso _face.Children.Contains(_secondsHand) Then
    _face.Children.Remove(_secondsHand)
  End If
  If _showSeconds Then
    _secondsHand = Hand(_secondsWidth, _secondsHeight,
      New SolidColorBrush(_secondColour), Nothing, 0, 0, 0)
    _secondsHand.RenderTransform = TransformGroup(Seconds * 6,
      -_secondsWidth / 2, -_secondsHeight + 4.25)
    If Not _face.Children.Contains(_secondsHand) Then
      _face.Children.Add(_secondsHand)
    End If
  End If
End Sub

Private Sub MinuteHand(ByVal Minutes As Integer, ByVal Seconds As Integer)
  If _minutesHand IsNot Nothing AndAlso _face.Children.Contains(_minutesHand) Then
    _face.Children.Remove(_minutesHand)
  End If
  If _showMinutes Then
    _minutesHand = Hand(_minutesWidth, _minutesHeight,
      New SolidColorBrush(_minuteColour), Nothing, 2, 2, 0.6)
    _minutesHand.RenderTransform = TransformGroup(6 * Minutes + Seconds / 10,
      -_minutesWidth / 2, -_minutesHeight + 4.25)
  End If
  If _face.Children.Contains(_minutesHand) = False Then
    _face.Children.Add(_minutesHand)
  End If
End Sub

Private Sub HourHand(ByVal Hours As Integer, ByVal Minutes As Integer, ByVal Seconds As Integer)
  If _hoursHand IsNot Nothing AndAlso _face.Children.Contains(_hoursHand) Then
    _face.Children.Remove(_hoursHand)
  End If
  If _showHours Then
    _hoursHand = Hand(_hoursWidth, _hoursHeight,
      New SolidColorBrush(_hourColour), Nothing, 3, 3, 0.6)
    _hoursHand.RenderTransform = TransformGroup(30 * Hours + Minutes / 2 + Seconds / 120,
      -_hoursWidth / 2, -_hoursHeight + 4.25)
  End If
  If _face.Children.Contains(_hoursHand) = False Then
    _face.Children.Add(_hoursHand)
  End If
End Sub

Private Sub AlarmMinuteHand(ByVal Minutes As Integer, ByVal Seconds As Integer)
  If _alarmMinutesHand IsNot Nothing AndAlso _face.Children.Contains(_alarmMinutesHand) Then
    _face.Children.Remove(_alarmMinutesHand)
  End If
  If _hasAlarm Then
    If _showAlarm Then
      _alarmMinutesHand = Hand(_alarmMinutesWidth, _alarmMinutesHeight,
        New SolidColorBrush(_alarmColour), Nothing, 2, 2, 0.6)
      _alarmMinutesHand.RenderTransform = TransformGroup(6 * Minutes + Seconds / 10,
        -_alarmMinutesWidth / 2, -_alarmMinutesHeight + 4.25)
    End If
    If _face.Children.Contains(_alarmMinutesHand) = False Then
      _face.Children.Add(_alarmMinutesHand)
    End If
  End If
End Sub

Private Sub AlarmHourHand(ByVal Hours As Integer, ByVal Minutes As Integer, ByVal Seconds As Integer)
  If _alarmHoursHand IsNot Nothing AndAlso _face.Children.Contains(_alarmHoursHand) Then
    _face.Children.Remove(_alarmHoursHand)
  End If
  If _hasAlarm Then
    If _showAlarm Then
      _alarmHoursHand = Hand(_alarmHoursWidth, _alarmHoursHeight,
        New SolidColorBrush(_alarmColour), Nothing, 3, 3, 0.6)
      _alarmHoursHand.RenderTransform = TransformGroup(30 * Hours + Minutes / 2 + Seconds / 120,
        -_alarmHoursWidth / 2, -_alarmHoursHeight + 4.25)
    End If
    If _face.Children.Contains(_alarmHoursHand) = False Then
      _face.Children.Add(_alarmHoursHand)
    End If
  End If
End Sub

Private Sub Layout(ByRef Canvas As Canvas)
  Dim _rim As New Ellipse
  Dim _inner As New Ellipse
  Canvas.Children.Clear()
  _diameter = Canvas.Width
  _rim.Height = _diameter
  _rim.Width = _diameter
  _rim.Fill = New SolidColorBrush(_rimColour)
  Canvas.Children.Add(_rim)
  _inner.Width = _diameter - 30
  _inner.Height = _diameter - 30
  _inner.Fill = New SolidColorBrush(_faceColour)
  Canvas.SetTop(_inner, 15)
  Canvas.SetLeft(_inner, 15)
  Canvas.Children.Add(_inner)
  _markers.Children.Clear()
  _markers.Width = _diameter
  _markers.Height = _diameter
  For i As Integer = 0 To 59
    Dim _marker As New Rectangle
    If i Mod 5 = 0 Then
      _marker.Width = 3
      _marker.Height = 8
      _marker.Fill = New SolidColorBrush(_markerColour)
      _marker.RenderTransform = TransformGroup(i * 6, -(_marker.Width / 2),
        -(_marker.Height * 2 + 4.5 - _rim.StrokeThickness / 2 - _diameter / 2 - 8))
    Else
      _marker.Width = 1
      _marker.Height = 4
      _marker.Fill = New SolidColorBrush(_markerColour)
      _marker.RenderTransform = TransformGroup(i * 6, -(_marker.Width / 2),
        -(_marker.Height * 2 + 12.75 - _rim.StrokeThickness / 2 - _diameter / 2 - 8))
    End If
    _markers.Children.Add(_marker)
  Next
  Canvas.Children.Add(_markers)
  _face.Width = _diameter
  _face.Height = _diameter
  Canvas.Children.Add(_face)
  _secondsHeight = _diameter / 2 - 20
  _minutesHeight = _diameter / 2 - 40
  _hoursHeight = _diameter / 2 - 60
  _alarmMinutesHeight = _diameter / 2 - 25
  _alarmHoursHeight = _diameter / 2 - 50
End Sub

Private Sub Timer_Tick(ByVal sender As Object, _
    ByVal e As EventArgs) _
    Handles _timer.Tick
  If _isRealTime Then _time = Now()
  If _hasAlarm Then
    If Format(_time, "hh:mm:ss") = _
        Format(_alarm, "hh:mm") & ":00" Then
      RaiseEvent Triggered()
    End If
  End If
  AlarmMinuteHand(_alarm.Minute, _alarm.Second)
  AlarmHourHand(_alarm.Hour, _alarm.Minute, _alarm.Second)
  SecondHand(_time.Second)
  MinuteHand(_time.Minute, _time.Second)
  HourHand(_time.Hour, _time.Minute, _time.Second)
End Sub
Image non disponible
Image non disponible
Image non disponible
Image non disponible

Étape 11

Puisque nous en sommes toujours à la vue de code pour le contrôle utilisateur Clock, dans le constructeur Public Sub New() en dessous de la ligne InitializeComponent(), tapez le code suivant :

 
Sélectionnez
Layout(Display)
_timer.Start()
Image non disponible

Étape 12

En restant toujours dans le vue de code pour le contrôle utilisateur Clock, au-dessus du End Class de Partial Public Class Clock, tapez les propriétés suivantes :

 
Sélectionnez
Public Property FaceColour() As Color
  Get         
    Return _faceColour
  End Get
  Set(ByVal Value As Color)
    If Value = Nothing Then
      _faceColour = COLOR_ROYALBLUE
    Else
      _faceColour = Value
    End If
    Layout(Display)
  End Set
End Property

Public Property RimColour() As Color
  Get         
    Return _rimColour
  End Get
  Set(ByVal Value As Color)
    If Value = Nothing Then
      _rimColour = Colors.Blue
    Else
      _rimColour = Value
    End If
    Layout(Display)
  End Set
End Property

Public Property MarkerColour() As Color
  Get         
    Return _markerColour
  End Get
  Set(ByVal Value As Color)
    If Value = Nothing Then
      _markerColour = Colors.White
    Else
      _markerColour = Value
    End If
    Layout(Display)
  End Set
End Property

Public Property SecondHandColor() As Color
  Get         
    Return _secondColour
  End Get
  Set(ByVal Value As Color)
    If Value = Nothing Then
      _secondColour = COLOR_TOMATO
    Else
      _secondColour = Value
    End If
  End Set
End Property

Public Property MinuteHandColor() As Color
  Get         
    Return _minuteColour
  End Get
  Set(ByVal Value As Color)
    If Value = Nothing Then
      _minuteColour = COLOR_GAINSBORO
    Else
      _minuteColour = Value
    End If
  End Set
End Property

Public Property HourHandColor() As Color
  Get         
    Return _hourColour
  End Get
  Set(ByVal Value As Color)
    If Value = Nothing Then
      _hourColour = COLOR_WHITESMOKE
    Else
      _hourColour = Value
    End If
  End Set
End Property

Public Property AlarmHandsColor() As Color
  Get         
    Return _alarmColour
  End Get
  Set(ByVal Value As Color)
    If Value = Nothing Then
      _alarmColour = Colors.Orange
    Else
      _alarmColour = Value
    End If
  End Set
End Property

Public Property Enabled As Boolean
  Get
    Return _isEnabled
  End Get
  Set(ByVal value As Boolean)
    _isEnabled = value
    If _isEnabled Then
      _timer.Start()
    Else
      _timer.Stop()
    End If
  End Set
End Property

Public Property RealTime As Boolean
  Get
    Return _isRealTime
  End Get
  Set(ByVal value As Boolean)
    _isRealTime = value
  End Set
End Property

Public Property ShowSeconds As Boolean
  Get
    Return _showSeconds
  End Get
  Set(ByVal value As Boolean)
    _showSeconds = value
  End Set
End Property

Public Property ShowMinutes As Boolean
  Get
    Return _showMinutes
  End Get
  Set(ByVal value As Boolean)
    _showMinutes = value
  End Set
End Property

Public Property ShowHours As Boolean
  Get
    Return _showHours
  End Get
  Set(ByVal value As Boolean)
    _showHours = value
  End Set
End Property

Public Property ShowAlarm As Boolean
  Get
    Return _showAlarm
  End Get
  Set(ByVal value As Boolean)
    _showAlarm = value
  End Set
End Property

Public Property Time() As DateTime
  Get
    Return _time
  End Get
  Set(ByVal Value As DateTime)
    _time = Value
  End Set
End Property

Public Property Alarm() As DateTime
  Get
    Return _alarm
  End Get
  Set(ByVal Value As DateTime)
    _alarm = Value
    _hasAlarm = Not _alarm = Nothing
  End Set
End Property
Image non disponible
Image non disponible
Image non disponible
Image non disponible

Étape 13

Retournez dans le concepteur de vues pour MainPage en sélectionnant l'onglet MainPage.xaml.

Puis dans la section Tous les contrôles Silverlight de la Boîte à outils, sélectionnez le contrôle Canvas :

Image non disponible

Étape 14

Dessinez deux Canvas sur la page, ensuite dans le volet XAML au-dessus de </Grid> modifiez les lignes <Canvas> comme ceci :

 
Sélectionnez
<Canvas Height="35" Width="400" VerticalAlignment="Top" HorizontalAlignment="Left" Name="Toolbar"></Canvas>
<Canvas Height="265" Width="400" Margin="0,35,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Name="Content"></Canvas>

Voir ci-dessous :

Image non disponible

Étape 15

Puis dans la section Contrôles Silverlight communs, sélectionnez le contrôle ComboBox :

Image non disponible

Étape 16

Dessinez deux ComboBox sur la barre d'outils du Canvas en glissant les ComboBox de la Boîte à outils sur le Canvas, ensuite dans le volet XAML entre les balises <Canvas> et </Canvas> modifiez les lignes <ComboBox> comme ceci :

 
Sélectionnez
<ComboBox Canvas.Left="6" Canvas.Top="6" Height="23" Width="75" Name="AlarmHours"/>
<ComboBox Canvas.Left="87" Canvas.Top="6" Height="23" Width="75" Name="AlarmMinutes"/>

Voir ci-dessous :

Image non disponible

Étape 17

Puis dans la section Contrôles Silverlight communs, sélectionnez le contrôle CheckBox :

Image non disponible

Étape 18

Dessinez un CheckBox sur le Canvas supérieur (barre d'outils) à côté des boutons, et modifiez la ligne <CheckBox> comme ceci :

 
Sélectionnez
<CheckBox Canvas.Left="168" Canvas.Top="10" Height="17" Width="75" Content="Set Alarm" Name="SetAlarm"/>

Voir ci-dessous :

Image non disponible

Étape 19

Sélectionnez Debug ensuite l'option Build AlarmClock du menu :

Image non disponible

Étape 20

Puis dans la section Contrôles AlarmClock de la Boîte à outils, sélectionnez le contrôle Clock (AlarmClock) :

Image non disponible

Étape 21

Dessinez un Clock sur le plus grand Canvas (ou Canvas Content) et dans le volet XAML modifiez la ligne <my:Clock> comme ceci :

 
Sélectionnez
<my:Clock Canvas.Left="75" Canvas.Top="10" x:Name="AlarmClock"/>

Voir ci-dessous :

Image non disponible

Étape 22

Faites un clic droit sur la page ou sur l'entrée pour MainPage.xaml dans l'Explorateur de solutions et choisissez l'option Afficher le code.

Dans la vue de code pour le constructeur Public Sub New() en dessous de la ligne InitializeComponent(), tapez le code suivant :

 
Sélectionnez
For H As Integer = 0 To 23
  AlarmHours.Items.Add(Format(H, "00"))
Next
AlarmHours.SelectedItem = CStr(Format(Now.Hour, "00"))
For M As Integer = 0 To 59
  AlarmMinutes.Items.Add(Format(M, "00"))
Next
AlarmMinutes.SelectedItem = CStr(Format(Now.Minute, "00"))
Image non disponible

Étape 23

Toujours dans la vue de code, en dessous du End Sub pour le constructeur Public Sub New(), tapez le Sub gestionnaire d'événement suivant :

 
Sélectionnez
Private Sub AlarmClock_Triggered() Handles AlarmClock.Triggered
  MessageBox.Show("Alarm!", "Alarm Clock", MessageBoxButton.OK)
End Sub 
Image non disponible

Étape 24

Retournez dans le concepteur de vues en sélectionnant l'onglet MainPage.xaml, ou faites un clic droit sur la page ou sur l'entrée pour MainPage.xaml dans l'Explorateur de solutions et choisissez l'option Concepteur de vues.

Cliquez sur le CheckBox « Set Alarm », ensuite allez dans la boîte Propriétés et cliquez sur l'onglet Événements :

Image non disponible


Double-cliquez sur l'événement Click et tapez ceci dans le Sub SetAlarm_Click :

 
Sélectionnez
If SetAlarm.IsChecked Then
  AlarmClock.Alarm = New DateTime(Now.Year, Now.Month, Now.Day, _
    CInt(AlarmHours.SelectedItem), _
    CInt(AlarmMinutes.SelectedItem), 0)
Else
  AlarmClock.Alarm = Nothing
End If
Image non disponible

Étape 25

Enregistrez le projet maintenant que vous avez terminé l'application Silverlight. Sélectionnez Debug ensuite Démarrer le débogage ou cliquez sur Démarrer le débogage :

Image non disponible

Une fois que vous l'avez fait, ce qui suit apparaîtra dans une nouvelle fenêtre du navigateur :

Image non disponible

Étape 26

Réglez l'alarme en utilisant les ComboBox pour sélectionner l'heure et les minutes, puis cochez la case « Set Alarm ». Un MessageBox apparaîtra quand l'alarme est déclenchée :

Image non disponible

Étape 27

Fermez l'application et la fenêtre du navigateur en cliquant sur le bouton Fermer Image non disponible en haut à droite de la fenêtre de l'application et du navigateur Web pour Arrêter l'application.

Conclusion

Ceci est une application de réveil simple. Vous pouvez modifier les couleurs utilisées sur l'horloge en la sélectionnant, puis en allant dans la boîte Propriétés et en modifiant les propriétés telles que l'aiguille des heures, la couleur du cadran, etc. Vous pourriez également personnaliser l'horloge de manière à lui faire utiliser une brosse à dégradé (GradientBrush) ou avec d'autres effets - personnalisez-la !

Liens

Remerciements

Je tiens ici à remercier Peter Bull de m'avoir autorisé à traduire son tutoriel.
Je remercie tomlev pour sa relecture technique et ses propositions.
Je remercie également FirePrawn pour sa relecture orthographique et ses propositions.