WPF Samples - Discovering

Allons faire un tour dans les WPF Samples, pour dénicher des exemples pertinents, prendre des notes et faire des remarques sur des points d'intérêt afin de découvrir la structure des applications WPF.NET.

Le meilleur point d'entrée pour les WPF Samples, c'est maintenant dans le GitHub :

Github- Microsoft/WPF-Samples: Repository for WPF related samples

Pour les novices, il faut commencer par faire un tour dans les exemples suivants :

WPF-Samples/Getting Started

Avec un exemple :

WPF-Samples/Getting Started/WalkthroughFirstWPFApp

C'est le projet historique en Visual Studio 2019 .NET Core 3.1, on va le retrouver sous une forme différente, plus aboutie et plus complète dans le projet suivant :

WPF-Samples/Sample Applications/ExpenseIt

En comparant la structures des deux projets :

Comparaison des applications WPF 

A gauche la propriété Command du Button est bindée sur CreateExpenseReportCommand tandis qu'à droite c'est un Event Clic sur du code-behind.

Regardez bien les chemins en haut de cette fenêtre dans le cas de droite vous êtes dans le répertoire Getting Started/WalkthroughFirstWPFApp dans le cas de gauche vous êtes dans le répertoire Sample Applications/ExpenseIt avec une évolution intéressante de ce Sample orienté vers le modèle MvvM.

Sample Applications - ExpensiIt

Cet exemple démontre l'utilisation de RoutedCommand :

MainWindow.xaml

<Button Name="createExpenseReportButton" Style="{StaticResource CommandButton}" Grid.Column="1" Grid.Row="5" Command="local:MainWindow.CreateExpenseReportCommand">

MainWindow.cs

Liste des RoutedUICommand

        #region Commands
        public static RoutedUICommand CreateExpenseReportCommand;
        public static RoutedUICommand ExitCommand;
        public static RoutedUICommand AboutCommand;
        #endregion

namespace System.Windows.Input
{
        class RoutedUICommand : RoutedCommand

Voici donc les trois commandes principales de l'application.

A partir de ces RoutedUICommand sont crées des commandes de Binding qui sont ajoutées dans la Collection des CommandBindings de la façon suivante :

        public MainWindow()
        {
            Initialized += MainWindow_Initialized;
            InitializeComponent();

            // Bind CreateExpenseReportCommand
            var commandBindingCreateExpenseReport = new CommandBinding(CreateExpenseReportCommand);
            commandBindingCreateExpenseReport.Executed += commandBindingCreateExpenseReport_Executed;
            CommandBindings.Add(commandBindingCreateExpenseReport);

Remarques : A quoi sert la EditBoxControlLibrary ? J'ai retiré la référence projet, j'ai nettoyé, cela fonctionne encore ... ?

Sample Applications - CalculatorDemo

Exemple de traitement d'entrées utilisateur avec plein de cliques sur plein de boutons différents. C'est un exemple de comment gérer tous ces boutons.

MyTextBox.cs

A quoi sert de dériver de TextBox ?

namespace CalculatorDemo
{    
     internal sealed class MyTextBox : TextBox
    {
        protected override void OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
        {
            e.Handled = true;
            base.OnPreviewGotKeyboardFocus(e);
        }
    }

Cela permet de créer une TextBox qui ne prendra jamais le focus. Cette TextBox déclare l'event Handled comme pris en compte et laisse le focus à l'objet qui l'avait.

MainWindow.xaml

MyTextBox est déclarée dans MainWindow grâce à la définition :

<Window x:Class="CalculatorDemo.MainWindow"
        xmlns:local="clr-namespace:CalculatorDemo"

Et positionne MyTextBox dans la Grid grâce à l'utilisation du mot clef local :

        <Grid Name="MyGrid" ShowGridLines="False">
            <local:MyTextBox Grid.Row="1" Grid.ColumnSpan="3" Grid.RowSpan="5" Margin="5" x:Name="PaperBox" />
        </Grid>

Sample Applications - DataBindingDemo

Le fameux exemple de Databinding. Il me semble que cet exemple vient de SilverLight ... Oui l'ancêtre de WPF c'est bien SilverLight le premier framework dans lequel Microsoft essaye de passer d'un modèle sur event (code-behind) à un modèle sur les propriété avec INotifyPropertyChanded (comme dans Java et le pattern de l'observer).

MainWindow.xaml

Il s'agit de cette fameuse ListBox dont le propriété ItemSource est bindée sur une ListingDataView qui est une CollectionViewSource.

Lorsque l'utilisateur se promène en cliquant sur les différents Items de la ListBox, en dessous le ContentControl bindé également sur ListingDataView change automatiquement ses valeurs.

  <ListBox Name="Master" AutomationProperties.Name="Items For Sale" Grid.Row="2" Grid.ColumnSpan="3"
                 ItemsSource="{Binding Source={StaticResource ListingDataView}}"

Et en dessous le ContentControl :

  <ContentControl Name="Detail" Grid.Row="3" Grid.ColumnSpan="3"
                        Content="{Binding Source={StaticResource ListingDataView}}"

MainWindow.cs

Le code source :

       private readonly CollectionViewSource _listingDataView;

       public MainWindow()
       {
           InitializeComponent();
           _listingDataView = (CollectionViewSource) (Resources["ListingDataView"]);
        }

Méchant gros bug en cliquant sur une des cases à cocher... Null Exception.

Sample Applications - Editing Examiner Demo

Voici typiquement le genre de Sample (Exemple) qui n'est pas assez documenté à mon avis :

GitHub - WPF-Samples - Sample Applications - EditingExaminerDemo

Je clique sur Exécuter :

WPF Samples - Editing Examiner Demo

D'après la documentation, il s'agit :

Editing Examiner vous permet de regarder en temps réel les modifications effectuées dans un contrôle RichTextBox. Il permet à l'utilisateur de charger ou d'insérer partiellement le langage XAML (Extensible Application Markup Language) dans un document à l'aide de l'analyseur principal ou de l'analyseur d'édition. En outre, il fournit une prise en charge de base pour l'appel de méthodes, ainsi que pour l'obtention et la définition de propriétés. Cet outil est utile pour examiner l'état d'édition d'un document sous différentes perspectives.

Il faut aller dans le code source pour découvrir la structure de ce projet par exemple avec l'explorateur d'Objets pour se rendre compte de sa complexité :

WPF Samples - Editing Examiner Demo
WPF Samples - Editing Examiner Demo

Si vous souhaitez démarrer un projet WPF consistant à éditer du Texte sous différentes formes c'est le projet idéal à connaitre absolument.

Par exemple le me pose une question, que faut-il mettre dans Type Command here!. J'essaye Dir cela semble ne pas fonctionner il me répond

[Parser error: the command line can't be evaluated!]

 A découvrir...

To Be Continued

Il faut dire qu'à force de jouer avec les WPF Samples, j'ai découvert l'extension Visual Studio Community WPF Template dans :

C# .NET: WPF - Développement d'une application moderne

Du coup je suis parti sur ces Templates pour continuer mon exploration de WPF Moderne Application mais les Samples sont une mine d'information d'exemples en WPF que je reviendrai décrire Ici.

N'hésitez pas à liker, à commenter, à partager...

Aucun commentaire:

Enregistrer un commentaire

Pour plus d'interactivité, n'hésitez pas à laisser votre commentaire.