Windows Phone 7 - Tutoriel 24 : Contrôle Expander

Contrôle Expander personnalisé en utilisant Silverlight sur Windows Phone 7

| Peter Bull | Deepin Prayag (Traduction) |

Traducteur

Deepin

Ce tutoriel fait partie d'une série de niveau débutant-intermédiaire pour apprendre Windows Phone 7 par le biais d'exemples pas à pas.

Langage : C#

Public visé : niveau Débutant

Commentez ce tutoriel : Commentez ♪

- Titre : Windows Phone 7 - Tutoriel 24 : Contrôle Expander

- Auteurs : Peter Bull, Deepin Prayag (Traduction)

- Traducteur : Deepin

- Parution : 23 mars 2012

- Mise à jour : 17 août 2012

- Licence : Copyright ® 2012 Peter Bull. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- Traduction

- Introduction

- Contrôle Expander personnalisé en utilisant Silverlight sur Windows Phone 7

- Étape 1

- Étape 2

- Étape 3

- Étape 4

- Étape 5

- Étape 6

- Étape 7

- Étape 8

- Étape 9

- Étape 10

- Étape 11

- Étape 12

- Étape 13

- Étape 14

- Étape 15

- Étape 16

- Conclusion

- Liens

- Remerciements

Traduction

Ce tutoriel est la traduction la plus fidèle possible du tutoriel original de Peter Bull, Windows Phone 7 - Expander Custom Control using Silverlight on Windows Phone 7.

Introduction

Expander Control est un panneau repliable en Silverlight pour Windows Phone 7, qui lorsqu'il est réduit n'affiche que la légende et le bouton, et affiche son contenu lorsqu'il est agrandi.

Contrôle Expander personnalisé en utilisant Silverlight sur Windows Phone 7

Étape 1

Démarrez Microsoft Visual Web Developer 2010 Express pour Windows Phone, ensuite sélectionnez Fichier puis Nouveau Projet… Sélectionnez Visual C# ensuite Silverlight for Windows Phone puis Application Windows Phone 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 :

Étape 2

Une page Application Windows Phone nommée MainPage.xaml devrait alors apparaître :

Étape 3

Sélectionnez Fichier puis Ajouter depuis le menu principal, puis Nouveau Projet… et sélectionnez le modèle Bibliothèque de classes Windows Phone, puis modifiez le Nom en Expander :

Étape 4

Ajoutez la nouvelle bibliothèque de classes en cliquant sur Ajouter, puis dans l'Explorateur de solutions pour Expander, cliquez sur Class1.cs, puis allez dans Propriétés et modifiez la propriété Nom de fichier à Expander.cs :

Étape 5

Dans la fenêtre « Vous renommez un fichier. Voulez-vous également renommer dans ce projet toutes les références à l'élément de code 'Class1' ? », choisissez Oui. Faites un clic droit sur le projet Expander (pas Expander.cs) dans l'Explorateur de solutions et choisissez Ajouter puis Nouveau dossier et nommez-le « Themes » (sans les guillemets) :

Étape 6

Faites un clic droit sur le dossier « Themes » du projet Expander, et choisissez Ajouter, puis Nouvel élément… sélectionnez le modèle Fichier texte et modifiez le nom en Generic.xaml :

Étape 7

Ajoutez le Fichier texte pour le ResourceDictionary en cliquant sur Ajouter. Dans le volet XAML de Generic.xaml, tapez le code ResourceDictionary XAML suivant :

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Expander">
<Style TargetType="local:Expander">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:Expander">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="ViewStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.5"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="Expanded">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="ContentScaleTransform"
Storyboard.TargetProperty="ScaleY" To="1" Duration="0"/>
<DoubleAnimation Storyboard.TargetName="RotateButtonTransform"
Storyboard.TargetProperty="Angle" To="180" Duration="0"/>
</Storyboard>
</VisualState>
<VisualState x:Name="Collapsed">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="ContentScaleTransform"
Storyboard.TargetProperty="ScaleY" To="0" Duration="0"/>
<DoubleAnimation Storyboard.TargetName="RotateButtonTransform"
Storyboard.TargetProperty="Angle" To="0" Duration="0"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}"
Background="{TemplateBinding Background}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Margin="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ContentPresenter Grid.Column="0" VerticalAlignment="Center" Content="{TemplateBinding HeaderContent}"/>
<ToggleButton Grid.Column="1" RenderTransformOrigin="0.5,0.5" x:Name="ExpandCollapseButton">
<ToggleButton.Template>
<ControlTemplate>
<Grid>
<Ellipse Width="50" Height="50" Fill="{StaticResource PhoneAccentBrush}"/>
<Path RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Center" VerticalAlignment="Center"
Data="M2,3L9,10 16,3" Stroke="{StaticResource PhoneForegroundBrush}" StrokeThickness="4"/>
</Grid>
</ControlTemplate>
</ToggleButton.Template>
<ToggleButton.RenderTransform>
<RotateTransform x:Name="RotateButtonTransform"/>
</ToggleButton.RenderTransform>
</ToggleButton>
</Grid>
<ContentPresenter Grid.Row="1" Margin="5" Content="{TemplateBinding Content}" x:Name="Content">
<ContentPresenter.RenderTransform>
<ScaleTransform x:Name="ContentScaleTransform"/>
</ContentPresenter.RenderTransform>
</ContentPresenter>
</Grid>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

Étape 8

Faites un clic droit sur l'entrée pour la classe Expander.cs dans l'Explorateur de solutions dans le projet Expander et choisissez Afficher le code ou double-cliquez sur Expander.cs. Dans la vue de code pour Expander, au-dessus de la ligne namespace Expander, tapez le code suivant :

using System.Windows.Controls.Primitives;

Également dans la vue de code, au-dessus de public class Expander tapez le code suivant :

[TemplateVisualState(Name = "Collapsed", GroupName = "ViewStates")]
[TemplateVisualState(Name = "Expanded", GroupName = "ViewStates")]
[TemplatePart(Name = "Content", Type = typeof(FrameworkElement))]
[TemplatePart(Name = "ExpandCollapseButton", Type = typeof(ToggleButton))]

Encore une fois dans la vue de code, à la fin de la ligne public class Expander tapez le code suivant :

: ContentControl

Toujours dans la vue de code, en dessous du « { » de la ligne public class Expander : ContentControl tapez les déclarations et les propriétés de dépendance suivantes :

private bool _useTransitions = true;
private VisualState _collapsedState;
private ToggleButton _toggleExpander;
private FrameworkElement _contentElement;

public static readonly DependencyProperty HeaderContentProperty =
DependencyProperty.Register("HeaderContent", typeof(object),
typeof(Expander), null);

public static readonly DependencyProperty IsExpandedProperty =
DependencyProperty.Register("IsExpanded", typeof(bool),
typeof(Expander), new PropertyMetadata(true));

public static readonly DependencyProperty CornerRadiusProperty =
DependencyProperty.Register("CornerRadius", typeof(CornerRadius),
typeof(Expander), null);

Étape 9

Puisque nous en sommes à la vue de code, en dessous de la déclaration CornerRadiusProperty, tapez les propriétés et méthodes suivantes :

public object HeaderContent
{
get { return GetValue(HeaderContentProperty); }
set { SetValue(HeaderContentProperty, value); }
}

public bool IsExpanded
{
get { return (bool)GetValue(IsExpandedProperty); }
set { SetValue(IsExpandedProperty, value); }
}

public CornerRadius CornerRadius
{
get { return (CornerRadius)GetValue(CornerRadiusProperty); }
set { SetValue(CornerRadiusProperty, value); }
}

public Expander()
{
DefaultStyleKey = typeof(Expander);
}

private void ChangeVisualState(bool useTransitions)
{
if (IsExpanded)
{
if (_contentElement != null)
{
_contentElement.Visibility = Visibility.Visible;
}
VisualStateManager.GoToState(this, "Expanded", useTransitions);
}
else
{
VisualStateManager.GoToState(this, "Collapsed", useTransitions);
_collapsedState = (VisualState)GetTemplateChild("Collapsed");
if (_collapsedState == null)
{
if (_contentElement != null)
{
_contentElement.Visibility = Visibility.Collapsed;
}
}
}
}

Étape 10

Puisque nous en sommes toujours à la vue de code, en dessous du « } » de la méthode ChangeVisualState tapez les gestionnaires d'événements suivants :

private void Toggle_Click(object sender, RoutedEventArgs e)
{
IsExpanded = !IsExpanded;
_toggleExpander.IsChecked = IsExpanded;
ChangeVisualState(_useTransitions);
}

private void Collapsed_Completed(object sender, EventArgs e)
{
_contentElement.Visibility = Visibility.Collapsed;
}

public override void OnApplyTemplate()
{
base.OnApplyTemplate();
_toggleExpander = (ToggleButton)GetTemplateChild("ExpandCollapseButton");
if (_toggleExpander != null)
{
_toggleExpander.Click += Toggle_Click;
}
_contentElement = (FrameworkElement)GetTemplateChild("Content");
if (_contentElement != null)
{
_collapsedState = (VisualState)GetTemplateChild("Collapsed");
if ((_collapsedState != null) && (_collapsedState.Storyboard != null))
{
_collapsedState.Storyboard.Completed += Collapsed_Completed;
}
}
ChangeVisualState(false);
}

Étape 11

Sélectionnez Build Solution depuis le menu Debug :

Étape 12

Quand le Build est complété, retournez au concepteur de vues MainPage en sélectionnant l'onglet MainPage.xaml. Puis dans la section Contrôles Expander, sélectionnez le contrôle Expander :

Étape 13

Dessinez un Expander sur la page en glissant un Expander de la Boîte à outils sur la page, ensuite dans le volet XAML entre les lignes

<Grid x:Name="ContentGrid" Grid.Row="1">

et

</Grid>

modifiez expander1 comme ceci :

<my:Expander HeaderContent="Expander">
<my:Expander.Content>
<StackPanel>
<Button Margin="4" Padding="4" Content="Button One"/>
<Button Margin="4" Padding="4" Content="Button Two"/>
<Button Margin="4" Padding="4" Content="Button Three"/>
<Button Margin="4" Padding="4" Content="Button Four"/>
</StackPanel>
</my:Expander.Content>
</my:Expander>

XAML :

Design :

Étape 14

Enregistrez le Projet maintenant que vous avez terminé l'application Windows Phone Silverlight. Sélectionnez l'option Windows Phone Emulator puis sélectionnez Debug, puis Démarrer le débogage ou cliquez sur Démarrer le débogage :

Dès que vous l'aurez fait, ce qui suit apparaîtra dans l'émulateur Windows Phone une fois chargé :

Étape 15

Cliquez sur le bouton rond avec la flèche pour réduire ou agrandir l'Expander :

Étape 16

Vous pouvez ensuite Arrêter l'application en sélectionnant la fenêtre d'application Visual Studio 2010 et en cliquant sur le bouton Arrêter le débogage :

Conclusion

Ceci est un contrôle Expander simple, il pourrait être étendu pour prendre en charge davantage de propriétés telles que la couleur de fond du HeaderContent par exemple ou en ajoutant plus de fonctionnalités - personnalisez-le !

Liens

- Téléchargez le code source du tutoriel.

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 stoyak pour sa relecture orthographique et ses propositions.