Documente Academic
Documente Profesional
Documente Cultură
Windows Presentation
Foundation
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• Présentation du formateur
• Qu’est-ce que c’est WPF ?
• Le plan de formation
• La certification Microsoft 70-511
• Publics concernés et connaissances requises
• Présentation de l’étude de cas
• Liens, bibliographie
• emmanuel@durin.org
• Mes références :
www.durin.org
Mon profil Alphorm : http://www.alphorm.com/auteur/emmanuel-durin
• Chefs de Projets
• Architectes
Introduction to WPF
https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.asp
Microsoft Developer Network
https://msdn.microsoft.com/en-us/library/ms754130%28v=vs.110%29.aspx
• Forums
Incontournable StackOverflow
• www.stackoverflow.com
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Objectif
• Découvrir les bases de XAML
XAML décrit une arborescence d’objets graphiques
XAML utilisé pour les IHM (Silverlight, WPF, Windows Phone,
Windows Store Apps)
XAML aussi utilisé en Workflow Foundation
<Border>
<Grid Height="70" Width="300">
<TextBlock Text="Prenom" FontSize="20"/>
</Grid>
</Border>
Le nommage des composants permet de les utiliser dans la page, après l’appel
à InitializeComponent, et mieux, dans l’événement Loaded
En effet dans l’événement Loaded, tous les calculs de taille, position, … ont été
appliqués au composant. Permet d’éviter les bugs comme : la position de mon
composant est incohérente
<Window ...
xmlns:bo="clr-namespace:BusinessObjects;assembly=BusinessObjects">
<Window.Resources>
<bo:Person x:Key="toto" Age="10" Firstname="toto" />
</Window.Resources>
// Abonnement :
buttonFill.Click += ButtonFillClick;
...
// Désabonnement :
buttonFill.Click -= ButtonFillClick;
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Propriétés des composants
Un certain nombre de propriétés permettent d’ajuster la disposition
des composants :
Margin. Ex : Margin="10" Margin="10 5" Margin="4 3 87 2"
Width, Height, MinWidth,MaxWidth,MinHeight, MaxHeight
VerticalAlignment et HorizontalAlignment ( Left,Right, Center, Stretch)
Padding du parent
Algorithme du peintre, et Panel.Zindex pour les superpositions
Familles de composants
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
De nombreux contrôles existent
On peut regrouper certains contrôles en familles :
ContentControls
HeaderedControls
ItemsControls
Panels
Shapes
…
<Button>Remplir</Button> <Button>
<Button.Content>Remplir</Button.Content>
<Button Content="Remplir"/> </Button>
<Button Padding="5">
<StackPanel Orientation="Horizontal">
<Image Source="Icone2.png" />
<TextBlock Text="S'abonner" VerticalAlignment="Center"/>
</StackPanel>
</Button>
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Les Panels
Ils regroupent plusieurs composants enfants
Ils positionnent souvent les enfants à travers des propriétés attachées
Les Panels sont
Canvas
StackPanel
VirtualizingStackPanel
Grid
WrapPanel
DockPanel
UniformGrid
Border hérite de FrameworkElement
<Canvas>
<Button Content="Button" Canvas.Left="215" Canvas.Top="115"/>
</Canvas>
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
Découvrir les ressources et leur utilisation
Dictionnaires de ressources
Accès programmatique
Ressources dynamiques
Ou bien :
<Grid>
<Grid.Background>
<StaticResource ResourceKey="sunriseBrush"/>
</Grid.Background> ...
backButton.Style =
Application.Current.Resources["BackButtonStyle"] as Style;
rootGrid.Resources["buttonBrush"] = newBrush;
<Grid Name="rootGrid">
<Grid.Resources>
<SolidColorBrush x:Key="buttonBrush" Color="Red" />
</Grid.Resources>
<Button Background="{DynamicResource buttonBrush}" />
</Grid>
Les Styles
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
Style implicite
Définir un style pour tous les composants d’un type
Classes de style
Définir un style pour un sous ensemble de composants
Hériter les styles
<Style TargetType="Button">
<Setter Property="Foreground" Value="Red"/>
</Style>
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
Les modèles (templates)
Arbre visuel et arbre logique
<ControlTemplate TargetType="Button">
<Border BorderBrush="{TemplateBinding Foreground}"
BorderThickness="2">
<TextBlock Text="{TemplateBinding Content}"/>
</Border>
</ControlTemplate>
ContentControl
Ils ont un ContentTemplate
ItemsControl ( ListBox, ComboBox), ont:
ItemTemplate : un élément de liste
ItemsPanelTemplate : la disposition des éléments
Pour faire une liste horizontale ou avec un WrapPanel
Border
Arbre logique (*) : ce qui disposé en XAML
Arbre visuel : inclut les templates, ce que AdornerDecorator
l’utilisateur voit au final
ContentPresenter AdornerLayer
Grid
Label Button
Border Border
ContentPresenter ContentPresenter
TextBlock TextBlock
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
DataBinding
INotifyPropertyChanged
Rarement fait car souvent les contrôles tirent leurs données d’un objet
ViewModel (Pattern MVVM).
Le rassemblement de toutes les données dans un objet ViewModel permet d’y
ajouter la logique de calcul des affichages
Source Target
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Objectif
• Découvrir IValueConverter pour convertir une
valeur ou un type pour l’affichage
Utilisation de la ressource
<StackPanel
Visibility="{Binding Path=ShowTutorial,
Converter={StaticResource booleanToVisibilityConverter}}">
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
ExceptionValidationRule pour attraper les erreurs de
conversion
ValidationRule personnalisée
Affichage du message d’erreur
Personnalisation du template des erreurs
Validation.AddErrorHandler(this.textBoxAge, AgeValidationHandler);
...
void AgeValidationHandler(object sender, ValidationErrorEventArgs e){
if (e.Action == ValidationErrorEventAction.Added)
MessageBox.Show(e.Error.ErrorContent.ToString());
}
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
ValidationRule personnalisée
public class NumberRangeRule : ValidationRule{
public override ValidationResult Validate(object value, CultureInfo
cultureInfo){
int number = … value …;
...
if (number < min || number > max) {
return new ValidationResult(false,
String.Format("Number must be in range {0} - {1}", min, max));
}
return ValidationResult.Result;
}
}
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
Toutes les validations ne peuvent être simples.
Validations déléguées à l’objet métier
Plan :
Validation par les exceptions de propriété
IDataErrorInfo pour une erreur par propriété
INotifyDataErrorInfo pour les validations asynchrones et plusieurs
erreurs par propriété
<TextBox x:Name="textboxLibellé”
Text="{Binding Libellé, Mode=TwoWay,
NotifyOnValidationError=True, ValidatesOnExceptions=True}"/>
PersonDecorator
Lastname : String
1 Firstname : String
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Objectif
En conception graphique, il est nécessaire de voir les données pour
concevoir les écrans.
Première solution : exécuter le code pour voir les écrans
Aller retours longs, car nécessite de compiler, exécuter et de naviguer
jusqu’au bon écran
Deuxième solution : les données de conception (design time data)
Le retour visuel est immédiat !
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
Hiérarchie des ItemsControls
ItemTemplate et ItemsPanel
DataGrid
TreeView
La partie de l'image av ec l'ID de relation rId3 n'a pas été trouv é dans le fichier.
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
DataType du DataTemplate
ItemTemplateSelector pour un choix dynamique
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
ObservableCollection<T>
CollectionViewSource
1. Click 2. CollectionChanged
ObservableCollection<Personne> personnes = …
CollectionViewSource sourcePersonnes = new CollectionViewSource();
sourcePersonnes.Source = personnes;
sourcePersonnes.Filter += SourcePersonnesFilter;
dataGridPersonnes.ItemsSource = sourcePersonnes.View;
...
void SourcePersonnesFilter(object sender, FilterEventArgs e){
var personne = e.Item as Personne;
e.Accepted = personne.Age >= ageMinimum;
}
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Objectif
Il s’agit de donner des données aux listes (sous classe de
ItemsControls), lors de la conception
Par défaut les listes sont des grands rectangles blancs vides !
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Model View ViewModel
• Pattern architectural comparable à Model View Controller
ou Model View Presenter
• Placé au niveau de la couche de présentation
View
Composants graphiques
ViewModel Model
Adaptation des données pour la vue Données métier.
Couche métier.
(Business Logic Layer)
View
Binding fournit
les listes
Commandes
Commandes d’objets pour
Commandes ListBox, …
ViewModel Objet 1
…
Objet N
est
propriété Mini ViewModel
• Très utile pour les tests unitaires : on peut tester le ViewModel plus
facilement que l’IHM
• Les commandes sont exposées en tant que propriétés du ViewModel
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• Les commandes
ICommand
ICommandSource CanExecute( param ) :bool
Command 1
Execute(param)
CommandParameter (1) CanExecuteChanged
CommandTarget : IInputElement
ButtonBase
MenuItem Button
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• RoutedCommands
• CommandBindings
• InputBindings
1 : CommandBinding.PreviewExecuted 6 : CommandBinding.Executed
Window
Tunneling
Bubbling
Tunneling
Bubbling
Button
3 : CommandBinding.PreviewExecuted 4 : CommandBinding.Executed
CommandBinding binding =
new CommandBinding(ApplicationCommands.Close, AppClose);
...
private void AppClose(object sender, ExecutedRoutedEventArgs e){
this.Close();
}
*
ICommand CommandBinding
ICommandSource CanExecute( param ) :bool Command : ICommand
Command 1 1 PreviewCanExecute
Execute(param)
CommandParameter (1) CanExecuteChanged CanExecute
CommandTarget : IInputElement PreviewExecuted
Executed
RoutedCommand
ButtonBase Name : String
ApplicationCommands
Save
MenuItem Button RoutedUICommand * Open
Text: String Cut
Copy
Paste
...
• CommandBindings
• InputBindings
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Objectif
• Découvrir comment implémenter le Glisser-Déposer
( Drag ‘n Drop)
DragEnter
DragDrop.DoDragDrop Entrée dans une
(source, dataObject, dragDropEffects)
cible de DnD
GiveFeeedBack
Donner un retour visuel Changer le curseur. DragOver
Ex : interdit, représentation des données Déplacement
DragLeave
Sortie
QueryContinueDrag
Sur modificaton de l’état du clavier (Ctrl, …)
Drop
Fourniture
du code de
retour de
DoDragDrop
DragDropEffects effect =
DragDrop.DoDragDrop(this, dataToDnD,
DragDropEffects.Copy | DragDropEffects.Move);
}
}
e.Effects = DragDropEffects.None;
// Vérifier que le format de données est acceptable
if (e.KeyStates.HasFlag(DragDropKeyStates.ControlKey))
e.Effects = DragDropEffects.Copy;
else
e.Effects = DragDropEffects.Move;
e.Handled = true;
}
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Objectif
• Exposer et négocier les formats de données pour le glisser-
déposer
• Vérifier sur la cible que les données sont dans un format
consommable
GiveFeeedBack
DragOver
Vérifier
DragLeave
QueryContinueDrag
Drop Vérifier
Fourniture
du code de
retour de
DoDragDrop
• Vérifier sur la cible que les données sont dans un format consommable
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• Démarrer un thread
ReaderWriterLock
Mutex
• Exclusion à travers plusieurs processus
Semaphore
• Exclusion avec ressource comptée
[MethodImpl(MethodImplOptions.Synchronized)]
Worker
GUI Event 1
Function
GUI Event 2
Fonction N+2
Fonction N+1
GUI Event 3
Fonction N
GUI Event 4
Fonction N-1
Pop
Passage vers
le thread
graphique
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Objectif
• Découvrir les facilités du BackgroundWorker
Démarrer une tâche de fond
Gérer l’affichage de la progression
Annulation de la tâche
User Handler
ProgressChanged
ReportProgress()
User Handler
CancelAsync()
User Handler
Fin du travail
User Handler
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
Fichiers de ressource
Localisation avec LocBaml
Multilingual Toolkit
Thread.CurrentThread.CurrentUICulture
Utilisé par l’IHM
Thread.CurrentThread.CurrentCulture
Utilisé par String.Format, DateTime.ToString
Msbuild :
Pour générer les uid :
msbuild /t:updateuid helloapp.csproj
Pour vérifier les doublons :
msbuild /t:checkuid helloapp.csproj
Outil LocBaml à télécharger et copier dans bin\debug
Extrait les ressources au format CSV pour localiser
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
WPF Localization Extension
Localiser un contrôle
Changer la culture dynamiquement
<Window …
xmlns:lex="http://wpflocalizeextension.codeplex.com"
lex:LocalizeDictionary.DesignCulture="en"
lex:ResxLocalizationProvider.DefaultAssembly="DemoLocalization"
lex:ResxLocalizationProvider.DefaultDictionary="Resources" >
<TextBlock Text="{lex:Loc WelcomeMsg}" />
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• UserControls
• Custom Controls
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• Routed Events
• Propagation
• Gestion globale
• Déclaration
Tunneling
Window
Bubbling
2 : Grid.PreviewMouseDown
Grid 5 : Grid.MouseDown
Tunneling
Bubbling
3 : Ellipse.PreviewMouseDown
Ellipse
4 : Ellipse.MouseDown
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• Dependency Properties
• Attached Properties
Grid.SetRow(buttonOK, 3);
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• La plupart du temps, le dessin n’est pas nécessaire
• Les composants de base suffisent
• Mais on peut avoir besoin de dessiner des courbes, camemberts, jauge
« techniques »
• Plan
• Layout Pass, LayoutTransform et RenderTransform
• Les Shapes
Measure(availableSize)
Layout Pass
Size ArrangeOverride(arrangeBounds)
RenderTransform
Shape
DefiningGeometry : Geometry
Fill : Brush
Stroke : Brush
StrokeDashArray : PenLineCap
StrokeThickness : double
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Objectif
• Streaming Geometry pour des dessins avec des performances accrues
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• Documents XPS
• Text Object Model, modèle de flux
• Affichage des documents
• Impressions
FixedDocumentSequence FixedDocument
*
*
FixedPage
*
PageContent UIElement
<DocumentViewer>
• Pour les FlowDocument :
• PrintServer
Pour s'adresser à un serveur en particulier et obtenir ses PrintQueues
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• MediaElement, contrôle de vidéo
• Les modes de MediaElement et MediaPlayer
• Mode indépendant et Mode Horloge
• MediaPlayer pour Streaming Geometry et les Brush
MediaElement
Propriétés Evénements Méthodes
IsPaused MediaOpened Play()
IsBuffering MediaEnded Pause()
IsMuted MediaFailed Stop()
Balance
HasAudio
HasVideo
LoadedBehavior
BufferingProgress
CanPause
SpeedRatio
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• Animations
• Storyboards
<Storyboard x:Name="storyboardClickButton">
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="(UIElement.Opacity)"
Storyboard.TargetName="buttonGo">
<EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"/>
<EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="1"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• EventTriggers
• PropertyTriggers et DataTriggers
• <DataTrigger>
Déclenché sur une propriété d’un objet CLR, métier
(pas forcément une dependency property)
• <MultiTrigger> : multiconditionnel
<Window.Triggers>
<EventTrigger RoutedEvent="ButtonBase.Click“
SourceName="buttonGo">
<BeginStoryboard
Storyboard="{StaticResource StoryboardClickButton}"/>
</EventTrigger>
</Window.Triggers>
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Objectif
• Découvrir les VisualStates
Button CommonStates
Normal
1 PointerOver
• A un instant donné le bouton
a un état pour chacun des
groupes d’état qui lui sont Pressed
définis
Disabled
• On peut créer ses propres
Groupes d’états.
• Exemple : une ListBox avec 2
représentations selon qu’elle a FocusStates
ou pas des éléments. Focused
1
Unfocused
PointerFocused
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Objectif
• Découvrir les Behaviors
• Note : les actions ne sont pas des behaviors. Elles ont une méthode Invoke
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• Intégrer un contrôle Windows Forms dans une application
WPF
• Intégrer un contrôle WPF dans une application Windows
Forms
<WindowsFormsHost x:Name="host">
<winforms:MonthCalendar />
</WindowsFormsHost>
public MainWindow(){
InitializeComponent();
MonthCalendar monthCalendar = (MonthCalendar)host.Child;
monthCalendar.DateSelected += (sender,e)
{
MessageBox.Show("Selected date is from " + e.Start + " to " + e.End);
}
}
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• GAC : Global Assembly Cache
• Déploiements lourds : projets de Setup et Xcopy
• Déploiement ClickOnce
• Pour être installée dans le GAC, une DLL doit avoir un nom fort :
Nécessité d’être signée un certificat
• Une DLL n’a pas forcément besoin de faire partie du GAC pour être utilisée.
Elle peut simplement être copiée dans le répertoire d’une application
• Non intrusif
• Impossibilité de faire une installation lourde et intrusive, qui nécessite des droits
d’administration :
Modification des clés de registre interdite,
Installation de composants COM interdit
Installation de service Windows
Mais possibilité d’installer des DLL, SQL server express ou Compact Edition,
Framework.Net
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• XAML Browser Applications
• Permissions et Full ou Partial Trust : la confiance
• Naviguer dans une application
• Fonctionnent dans le navigateur (IE6+ et Firefox (Windows avec .Net 3.5 et Mac OS)
Navigation intégrée avec le navigateur
• Interdit
Accès au glisser-déposer de l’OS, Effets Bitmaps (dépréciés en .NET 3.5 SP1),
Communication directe avec DB (à moins du Full trust), Interopérabilité avec
des contrôles Windows ou des contrôles ActiveX, la plupart des boîtes de
dialogue standard, Shader effects, Fenêtres de haut niveau
NavigationService
CanGoBack : bool
CanGoForward : bool
Page GoBack()
NavigationService GoForward()
Navigate( …)
RemoveBackEntry()
• Gère la navigation
Frame
Mêmes membres de
navigation que
NavigationWindow
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• Rappels Débogage
• Visualiseur WPF
• PresentationTraceSources
• Snoop
Déboguer/Pas à pas principal F10 Ne rentre pas dans le détail des fonctions
Ctrl+Alt+W,1 Espion 1
Ctrl+Alt+V,A Automatique
Ctrl+Alt+I Immédiat
Ctrl+Alt+O Sortie
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• Tests unitaires
• Tests d’intégration avec UI automation
• Coded UI Tests
AutomationElement buttonOK =
AutomationElement.RootElement.FindFirst(
TreeScope.Descendants,
new PropertyCondition(
AutomationElement.AutomationIdProperty,
"buttonOK"));
// Obtention du pattern.
InvokePattern pattern = (InvokePattern)
button.GetCurrentPattern(InvokePattern.Pattern);
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Objectif
• Attraper toutes les exceptions
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(OnUnhandledException);
Site : http://www.alphorm.com
Blog : http://www.alphorm.com/blog
Emmanuel DURIN
Formateur et Consultant indépendant
Forum : http://www.alphorm.com/forum Développement logiciel
Windows Presentation Foundation avec Visual Studio 2013 alphorm.com™©
Plan
• Rappels des objectifs de la formation
• Liens, bibliographie
• Coordonnées formateur
• emmanuel@durin.org
• Mes références :
www.durin.org
Mon profil Alphorm : http://www.alphorm.com/auteur/emmanuel-durin
Introduction to WPF
https://msdn.microsoft.com/en-us/library/aa970268%28v=vs.110%29.asp
Microsoft Developer Network
https://msdn.microsoft.com/en-us/library/ms754130%28v=vs.110%29.aspx
• Forums
Incontournable Stackoverflow
• www.stackoverflow.com