Traduction▲
Ce tutoriel est la traduction la plus fidèle possible du tutoriel original de Peter Bull, Windows Phone 7 - FlipPanel Custom Control using Silverlight on Windows Phone 7.
Introduction▲
FlipPanel Control est un panneau à double face en Silverlight pour Windows Phone 7, qui affiche un contenu sur le « recto », et un autre contenu sur le « verso » quand il est retourné.
Contrôle FlipPanel 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# puis 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 FlipPanel :
Étape 4▲
Ajoutez la nouvelle bibliothèque de classe au Projet en cliquant sur Ajouter, puis dans l'Explorateur de Solutions pour FlipPanel, cliquez sur Class1.cs, puis allez dans Propriétés et modifiez la propriété Nom de fichier à FlipPanel.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 FlipPanel (et non sur FlipPanel.cs) dans l'Explorateur de solutions et choisissez Ajouter puis Nouveau dossier, et nommez-le Themes :
Étape 6▲
Faites un clic droit sur le dossier Themes du projet FlipPanel, 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:FlipPanel"
>
<Style
TargetType
=
"local:FlipPanel"
>
<Setter
Property
=
"Template"
>
<Setter.Value>
<ControlTemplate
TargetType
=
"local:FlipPanel"
>
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup
x
:
Name
=
"ViewStates"
>
<VisualStateGroup.Transitions>
<VisualTransition
To
=
"Normal"
From
=
"Flipped"
GeneratedDuration
=
"0:0:0.7"
>
<Storyboard>
<DoubleAnimation Storyboard.
TargetName
=
"BackContentProjection"
Storyboard.
TargetProperty
=
"RotationY"
To
=
"-90"
Duration
=
"0:0:0.5"
/>
<DoubleAnimation Storyboard.
TargetName
=
"FrontContentProjection"
Storyboard.
TargetProperty
=
"RotationY"
To
=
"0"
BeginTime
=
"0:0:0.5"
Duration
=
"0:0:0.5"
/>
</Storyboard>
</VisualTransition>
<VisualTransition
To
=
"Flipped"
From
=
"Normal"
GeneratedDuration
=
"0:0:0.7"
>
<Storyboard>
<DoubleAnimation Storyboard.
TargetName
=
"FrontContentProjection"
Storyboard.
TargetProperty
=
"RotationY"
To
=
"90"
Duration
=
"0:0:0.5"
/>
<DoubleAnimation Storyboard.
TargetName
=
"BackContentProjection"
Storyboard.
TargetProperty
=
"RotationY"
To
=
"0"
BeginTime
=
"0:0:0.5"
Duration
=
"0:0:0.5"
/>
</Storyboard>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState
x
:
Name
=
"Normal"
>
<Storyboard>
<DoubleAnimation Storyboard.
TargetName
=
"BackContentProjection"
Storyboard.
TargetProperty
=
"RotationY"
To
=
"-90"
Duration
=
"0"
/>
</Storyboard>
</VisualState>
<VisualState
x
:
Name
=
"Flipped"
>
<Storyboard>
<DoubleAnimation Storyboard.
TargetName
=
"FrontContentProjection"
Storyboard.
TargetProperty
=
"RotationY"
To
=
"90"
Duration
=
"0"
/>
<DoubleAnimation Storyboard.
TargetName
=
"FlipButtonTransform"
Storyboard.
TargetProperty
=
"Angle"
To
=
"90"
Duration
=
"0"
/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid.RowDefinitions>
<RowDefinition
Height
=
"Auto"
/>
<RowDefinition
Height
=
"Auto"
/>
</Grid.RowDefinitions>
<Border
BorderBrush
=
"{TemplateBinding BorderBrush}"
BorderThickness
=
"{TemplateBinding BorderThickness}"
CornerRadius
=
"{TemplateBinding CornerRadius}"
Background
=
"{TemplateBinding Background}"
>
<ContentPresenter
Content
=
"{TemplateBinding FrontContent}"
/>
<Border.Projection>
<PlaneProjection
x
:
Name
=
"FrontContentProjection"
/>
</Border.Projection>
</Border>
<Border
BorderBrush
=
"{TemplateBinding BorderBrush}"
BorderThickness
=
"{TemplateBinding BorderThickness}"
CornerRadius
=
"{TemplateBinding CornerRadius}"
Background
=
"{TemplateBinding Background}"
>
<ContentPresenter
Content
=
"{TemplateBinding BackContent}"
/>
<Border.Projection>
<PlaneProjection
x
:
Name
=
"BackContentProjection"
/>
</Border.Projection>
</Border>
<ToggleButton Grid.
Row
=
"1"
RenderTransformOrigin
=
"0.5,0.5"
Margin
=
"0,10,0,0"
x
:
Name
=
"FlipButton"
>
<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
Angle
=
"-90"
x
:
Name
=
"FlipButtonTransform"
/>
</ToggleButton.RenderTransform>
</ToggleButton>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
Étape 8▲
Faites un clic droit sur la classe FlipPanel.cs dans l'Explorateur de solutions dans le projet FlipPanel et choisissez Afficher le code ou double-cliquez sur FlipPanel.cs. Dans la vue de code pour FlipPanel, au-dessus de la ligne namespace FlipPanel, tapez le code suivant :
using
System.
Windows.
Controls.
Primitives;
Également dans la vue de code, au-dessus de public class FlipPanel, tapez le code suivant :
[TemplateVisualState(Name =
"Normal"
, GroupName =
"ViewStates"
)]
[TemplateVisualState(Name =
"Flipped"
, GroupName =
"ViewStates"
)]
[TemplatePart(Name =
"FlipButton"
, Type =
typeof
(ToggleButton))]
[TemplatePart(Name =
"FlipButtonAlternative"
, Type =
typeof
(ToggleButton))]
Encore une fois dans la vue de code, à la fin de la ligne public class FlipPanel, tapez le code suivant :
:
Control
Et toujours dans la vue de code, en dessous du « { » de la ligne public class FlipPanel : ContentControl, tapez les déclarations et les propriétés de dépendance suivantes :
public
static
readonly
DependencyProperty FrontContentProperty =
DependencyProperty.
Register
(
"FrontContent"
,
typeof
(
object
),
typeof
(
FlipPanel),
null
);
public
static
readonly
DependencyProperty BackContentProperty =
DependencyProperty.
Register
(
"BackContent"
,
typeof
(
object
),
typeof
(
FlipPanel),
null
);
public
static
readonly
DependencyProperty IsFlippedProperty =
DependencyProperty.
Register
(
"IsFlipped"
,
typeof
(
bool
),
typeof
(
FlipPanel),
new
PropertyMetadata
(
true
));
public
static
readonly
DependencyProperty CornerRadiusProperty =
DependencyProperty.
Register
(
"CornerRadius"
,
typeof
(
CornerRadius),
typeof
(
FlipPanel),
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
FrontContent
{
get
{
return
GetValue
(
FrontContentProperty);
}
set
{
SetValue
(
FrontContentProperty,
value
);
}
}
public
object
BackContent
{
get
{
return
GetValue
(
BackContentProperty);
}
set
{
SetValue
(
BackContentProperty,
value
);
}
}
public
bool
IsFlipped
{
get
{
return
(
bool
)GetValue
(
IsFlippedProperty);
}
set
{
SetValue
(
IsFlippedProperty,
value
);
}
}
public
CornerRadius CornerRadius
{
get
{
return
(
CornerRadius)GetValue
(
CornerRadiusProperty);
}
set
{
SetValue
(
CornerRadiusProperty,
value
);
}
}
public
FlipPanel
(
)
{
DefaultStyleKey =
typeof
(
FlipPanel);
}
private
void
ChangeVisualState
(
bool
useTransitions)
{
if
(
IsFlipped)
{
VisualStateManager.
GoToState
(
this
,
"Normal"
,
useTransitions);
}
else
{
VisualStateManager.
GoToState
(
this
,
"Flipped"
,
useTransitions);
}
}
É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
FlipButton_Click
(
object
sender,
RoutedEventArgs e)
{
IsFlipped =
!
IsFlipped;
ChangeVisualState
(
true
);
}
public
override
void
OnApplyTemplate
(
)
{
base
.
OnApplyTemplate
(
);
ToggleButton _flipButton =
(
ToggleButton)GetTemplateChild
(
"FlipButton"
);
if
(
_flipButton !=
null
)
{
_flipButton.
Click +=
FlipButton_Click;
}
ToggleButton _flipButtonAlt =
(
ToggleButton)GetTemplateChild
(
"FlipButtonAlternative"
);
if
(
_flipButtonAlt !=
null
)
{
_flipButtonAlt.
Click +=
FlipButton_Click;
}
ChangeVisualState
(
false
);
}
Étape 11▲
Sélectionnez Build Solution depuis le menu Debug :
Étape 12▲
Quand la compilation est terminée, retournez au concepteur de vues MainPage en sélectionnant l'onglet MainPage.xaml. Puis dans la section Contrôles FlipPanel, sélectionnez le contrôle FlipPanel :
Étape 13▲
Dessinez un FlipPanel sur la page en glissant un FlipPanel 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 flippanel1 comme ceci :
<
my
:
FlipPanel>
<
my
:
FlipPanel.FrontContent>
<StackPanel>
<TextBlock
Margin
=
"4"
FontWeight
=
"Bold"
Text
=
"Front Content"
/>
<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
:
FlipPanel.FrontContent>
<
my
:
FlipPanel.BackContent>
<StackPanel>
<TextBlock
Margin
=
"4"
FontWeight
=
"Bold"
Text
=
"Back Content"
/>
<CheckBox
Margin
=
"4"
Padding
=
"4"
Content
=
"CheckBox One"
/>
<CheckBox
Margin
=
"4"
Padding
=
"4"
Content
=
"CheckBox Two"
/>
<CheckBox
Margin
=
"4"
Padding
=
"4"
Content
=
"CheckBox Three"
/>
<CheckBox
Margin
=
"4"
Padding
=
"4"
Content
=
"CheckBox Four"
/>
</StackPanel>
</
my
:
FlipPanel.BackContent>
</
my
:
FlipPanel>
XAML :
Design :
Étape 14▲
Enregistrez le Projet maintenant que vous avez terminé l'application Windows Phone Silverlight. Sélectionnez l'option Windows Phone Emulator ensuite 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 retourner le FlipPanel :
É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 FlipPanel simple qui pourrait être personnalisé et même étendu en ajoutant des propriétés et des fonctionnalités supplémentaires telles que la possibilité de retourner horizontalement ou verticalement, voire d'autres fonctionnalités encore - personnalisez-le !
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 f-leb pour sa relecture orthographique et ses propositions.