Silverlight 2: ajout d'un tooltip pour agrandir l'image dans une combobox
Si l'on reprends mon précédent post, il serait intéressant d'y ajouter un tooltip permettant d'agrandir l'image affichée dans la combobox au survol de la souris.
En WPF, en reprenant la définition XAML de ma combobox précédente, cela se fait de la manière suivante:
<ComboBox.ToolTip>
<ToolTip DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}">
<Image Source="{Binding SelectionBoxItem.uneImageJpeg}" />
</ToolTip>
</ComboBox.ToolTip>
Coté Silverlight, le contrôle ComboBox n’expose pas de tooltip par défaut mais cela est facilement réglable avec un service appelé ToolTipService. Malheureusement, il a une autre différente plus embêtante : nous n’avons pas le support du RelativeSource en Silverlight. Nous n’allons donc pas pouvoir définir de manière purement XAML le comportement de notre tooltip. Voici la solution que je vous propose. Dans la définition de votre combobox Silverlight 2, ajoutez ce morceau de XAML :
<ToolTipService.ToolTip>
<Image x:Name="ImageTooltip" Loaded="ImageTooltip_Loaded" />
</ToolTipService.ToolTip>
Nous indiquons ici que nous ajoutons une fonctionnalité de ToolTip à notre combobox. Pour pouvoir alimenter l’image le constituant de manière dynamique, nous allons nous abonner à l’évènement « Loaded ». Voici la méthode qui est alors appelée au chargement :
private void ImageTooltip_Loaded(object sender, RoutedEventArgs e)
{
//On récupère l'élément actuellement sélectionné dans la combobox
//et on en extrait l'image au format binaire
byte[] ImageBinaire = ((MonTypeAvecImage)maSuperCombobox.SelectionBoxItem).uneImageJpeg;
//Code identique au convertisseur
BitmapImage img = new BitmapImage();
using (MemoryStream stream = new MemoryStream((byte[])ImageBinaire))
{
img.SetSource(stream);
}
//On remplit la source de l'image du tooltip
((Image)sender).Source = img;
}
Et voici le résultat du survol de la souris sur la combobox dans mon cas:
David
Comments
- Anonymous
December 19, 2008
En continuité des 2 posts précédents ( ici et là ), voici un autre sujet où j’ai un peu perdu de temps.