Comment savoir qu'elle version du C Sharp (C#) vous utilisez ?

Je suis avec Visual Studio 2022 Community, et je développe une application Blazor alors que je cherche à utiliser une bibliothèque JavaScript depuis mon Blazor je tombe sur une bizarrerie :

Visual Studio vous demande d'utiliser C# 11.0 ou une version ultérieure ?!!
Visual Studio vous demande d'utiliser C# 11.0 ou une version ultérieure ?!!

Mais du coup je voudrais savoir comment installer C# 11.0 ou découvrir comment savoir qu'elle version du C Sharp j'utilise.

La réponse est peu évidente, il faut aller lancer une commande au fin fond de l'install de votre Visual Studio :

>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\Roslyn\csc.exe /langversion:?

Ce qui me donne le résultat suivant :

Commande pour savoir qu'elle version du CSharp vous utilisez
Commande pour savoir qu'elle version du CSharp vous utilisez

Avec une sourire je découvre que j'utiliser la version du CSharp (C#) 11.0.

Je retourne lire attentivement le message délivré par Visual Studio et je lis "version du langage 11.0 ou ultérieure" !? "ultérieur" me fais sourire. 

Mais maintenant je sais qu'elle version du Langage CSharp (C#) j'utilise.

Venez découvrir comment j'ai corrigé cette erreur : 

La fonctionnalité "littéraux de chaîne brute n'est pas disponible en C# 9.0. Utilisez la version de langage 11.0 ou une version ultérieure.

Dans :

GitHub - mabyre - My BlazingPizza

Have fun!

WPF Modern UI Comparative Architectures

Je cherche à découvrir les structures (ou les architectures) des applications WPF, j'ai découvert plusieurs Templates d'applications WPF avec des Galeries de Composants Graphiques Utilisateurs et je vois beaucoup de code derrière alors à quoi sert-il, pourquoi tout ce code ?

Je zoom sur Wpf.UI du projet :

GitHub WPF-UI Lepo.co

WPF-UI se trouve en package nuget téléchargeable indépendamment : 

NuGet Gallery | WPF-UI 2.0.3

Pour la Librairie WPF-UI utilisée en référence dans le projet :

\Lepoco-WpfUI\src\Wpf.Ui.Gallery\Wpf.Ui.Gallery.csproj

On trouve la structure suivante :

Lepo Wpf.UI - Structure
Lepo Wpf.UI - Structure

La seule dépendance de Wpf.Ui en dehors du framework c'est : System.Drawing.Common

Microsoft Learn - System.Drawing.Common .NET

En essayant de comparer la structure de cette application WPF avec le projet :

GitHub-Kinnara - ModernWpf

Qui lui ne fait aucune référence à System.Drawing.Common...

Je vais utiliser un troisième modèle de comparaison car Kinnara me semble ne pas utiliser les structures nécessaires pour utiliser le modèle MvvM qui est acquis maintenant.

Et la base de tous certainement :

GitHub - MahApps

On ne conçoit pas de développer une application conséquente sans structuration par MvvM, injection des dépendances, ... aussi je me lance dans un premier template :

GitHub-mabyre/WpfAppRibbonTemplateStudio

A partir de TemplateStudio le modèle Ribbon - Prism

Il me semble qu'en démarrant directement un projet à l'aide de TemplateStudio, je passe à côté de nombreuses problématiques, du coup je vais décrire les Samples des projets que j'ai déjà récoltés. Afin d'en découvrir la structure.

A force de me promener dans ces différents projets, je trouve un truc que je crois être cool, pour traiter les icônes dans : 

\\Visual Studio 2022\Samples\Kinnara-ModernWPF\ModernWPF Net6-7\ModernWPF\ModernWpf\IconElement\Symbol.cs

Mais cela va me mener encore plus bas dans l'OS MS... dans le traitement des icônes.

Les projets de Modern UI pour WPF ont tous une grosse librairie associée dont voici une description succincte des dépendances afin de mieux saisir comment elles sont imbriqués dans l'OS MS ou framework :

Fluent.Ribbon

System.Windows.Documents.Adorner

System.Windows.FrameworkElement

System.Windows.DependencyObject

System.Windows.DependencyProperty

System.ComponentModel.INotifyPropertyChanged

System.Windows.Automation.Peers.FrameworkElementAutomationPeer

System.Collections.ObjectModel.ObservableCollection

System.Windows.Controls.ItemsControl

System.Windows.RoutedEventArgs : EventArgs

System.Windows.Data.IValueConverter

System.Windows.Data.IMultiValueConverter

MahApps.Metro

System.Windows.FrameworkElement

Microsoft.Xaml.Behaviors.TriggerAction<T>

Microsoft.Xaml.Behaviors.Behavior<T>

ControlzEx.Behaviors.WindowChromeBehavior

System.Windows.DependencyObject

System.Window.VisualStateManager : DependencyObject 

System.Windows.DependencyProperty

System.Windows.Automation.Peers.FrameworkElementAutomationPeer

System.Windows.Point

System.Windows.Controls.Primitives

System.Windows.FreezableCollection<T>

System.Windows.Controls.Control : FrameworkElement

System.IEquatable<T>

System.Windows.Controls.ContentControl

System.Windows.Controls.HeaderedContentControl : ContentControl

System.Windows.RoutedEventArgs : EventArgs

System.Resources.ResourceManager

System.Windows.Data.IValueConverter

System.Windows.Markup.MarkupExtension

Wpf.Ui Lepo

System.Windows.Input.ICommand

System.Action<T?> 

System.PlatformID

System.Windows.Controls.ContentControl

System.Windows.Clipboard

System.Windows.RoutedEventHandler

System.Windows.RoutedEvent

System.Windows.DependencyProperty

System.Drawing.ToolboxBitmap

System.Windows.Window

System.Windows.Interop.WindowInteropHelper

System.Windows.Data.IValueConverter

System.Windows.Data.IMultiValueConverter

System.Windows.SystemParameters

System.Windows.Point

System.Windows.Media.RenderCapability

System.Runtime.InteropServices

System.Windows.Interop

La partie de la Lib Wpf.Ui concernant l'Interop (interopérabilité) est instructive je vous la conseil

System.Windows.ResourceDictionary

System.ComponentModel

System.Windows.Markup

System.Windows.DynamicResourceExtension

ModernWPF by Kinnara

Cette Librairie modern WPF semble prendre ses racines encore plus loin dans l'OS MS. Voici donc quelques références loin loin dans le framework MS.

Je note ici les dépendances qui ne sont pas dans les autres projets (ou que je n'ai pas trouvé).

System.WeakReference<T> : ISerializable where T : class (allow object to control its own serial/deserial)

System.Resources.ResourceManager gestion de la localization

TypedEventHandler<TSender, TResult>(TSender sender, TResult args)

System.Windows.Freezable : DependencyObject

System.Windows.Media.Geometry

System.Windows.Controls.ContentPresenter : FrameworkElement

System.Windows.CornerRadius : IEquatable<CornerRadius>

...

Dépendances des Librairies Modern UI

C'est un travail fastidieux mais il permet de rendre compte de l'imbrication de ces librairies avec le framework (ou les frameworks .NET Framework 4.6.2 - 4.7 .NET Core 3.1). 

Des trois librairies Wpf.Ui est un peu différentes car elle ne s’appuie que sur le framework .NET 6.0. mais Wpf.Ui descend très profondément dans la tripaille de Windows, avec des objets comme Interop et InterropServices qui sont bas dans l'OS et en redéfinissant par exemple le "Point".

Fluent.Ribbon est la plus simple des trois librairies c'est certainement lié au fait qu'elle ne se préoccupe que de l'objet Ribbon.

On peut constater que les ModernWpfUI ont encore besoin de beaucoup de code pour fonctionner.

WPF Modern Application - Structure

A ce stade, il est important de faire la liste des sujets que l'on va aborder Ici. Car petit à petit en progressant, je me rends compte qu'ils sont nombreux. Les différentes documentation sont pléthoriques.

Donc quels sont les grands sujets concernant l'architecture des applications WPF ? 

Microsoft Learn - Vue d’ensemble des bibliothèques runtime

Cette page nous propose les sujets de structuration de votre application WPF suivants :

Contenu conceptuelPackage NuGet
ConfigurationMicrosoft.Extensions.Configuration
Injection de dépendances    Microsoft.Extensions.DependencyInjection
Globbing de fichiersMicrosoft.Extensions.FileSystemGlobbing
Hôte génériqueMicrosoft.Extensions.Hosting
HTTPMicrosoft.Extensions.Http
LocalisationMicrosoft.Extensions.Localization
LoggingMicrosoft.Extensions.Logging

Voilà déjà une liste des sujets proposés par Microsoft Learn.

Démarrage

Navigation

MVVM

WPF Modern Application - Démarrage & Navigation

Le démarrage d'une application WPF dépend des choix concernant la Navigation entre les Page, Windows ou UserControl.

La Navigation est le premier Sujet d'une application WPF.

Stack Overflow -Window vs Page vs UserControl for WPF navigation ?

Les trois objets de la Navigation sont :

  • Window quand vous souhaitez faire apparaître une nouvelle fenêtre
  • Page qui est à l'intérieur d'une fenêtre plutôt utilisée dans les systèmes à base de Web comme XBAP
  • UserControl qui contient des contrôles créés dynamiquement comme lorsque l'on utilise le pattern MVVM

Avec Prism les ViewModel dérivent de BindableBase 

avec Community.Mvvm ils dérivent de ObservableObject.

Les deux Modèles Prism et Community.Mvvm sont assez différents, il y a bon nombre de lignes de code qui diffèrent.

Fluent.Ribbon - Showcase

App.xaml : StartupUri="TestWindow.xaml"

App.xaml.cs : Gestion des Theme par ControlzEx

Button Click="OpenRibbonWindowColorized_OnClick"

private void OpenRibbonWindowColorized_OnClick(object sender, RoutedEventArgs e)
{
      new RibbonWindowColorized().Show();
}

MahApps.Metro - Demo

App.xaml : StartupUri="MainWindow.xaml"

MainWindow.xaml.cs : 

    public partial class MainWindow : MetroWindow : Window PART_Icon, PART_TitleBar
    {
        public MainWindow()
        {
            _viewModel = new MainWindowViewModel(DialogCoordinator.Instance);
            DataContext = _viewModel;

    public class MainWindowViewModel : ViewModelBase, IDataErrorInfo, IDisposable
    {
            this.Title = "Flyout Binding Test";
            this._dialogCoordinator = dialogCoordinator;
            SampleData.Seed();

Focus sur le bouton du menu : "Show InputDialog"

MahApps.Metro.Samples\MahApps.Metro.Demo\MainWindow.xaml

     <MenuItem Click="ShowInputDialog" Header="Show InputDialog" />

\MahApps.Metro.Samples\MahApps.Metro.Demo\MainWindow.xaml.cs

        private async void ShowInputDialog(object sender, RoutedEventArgs e)
        {
            var result = await this.ShowInputAsync("Hello!", "What is your name?");

            if (result == null) //user pressed cancel
                return;

            await this.ShowMessageAsync("Hello", "Hello " + result + "!");
        }

Vu comment cela est architecturé, on aurait du mal à passer le résultat de ces boites de dialogues dans le ViewModel de la fenêtre principale...

ModernWPF by Kinnara

Rien dans App.xaml.cs, App.xml fait un StartupUri="MainWindow.xaml" et pour la Navigation ils utilisent public partial class NavigationRootPage :

 \ModernWpf.SampleApp\Navigation\NavigationRootPage.xaml.cs

public class partial NavigationRootPage

Wpf.Ui Lepo

Dans Wpf.Ui.Demo.Mvvm l'application démarre grâce à Microsoft.Extensions.Hosting :

\\Lepoco-WpfUI\src\Wpf.Ui.Gallery\App.xaml.cs

https://docs.microsoft.com/dotnet/core/extensions/generic-host
https://docs.microsoft.com/dotnet/core/extensions/dependency-injection
https://docs.microsoft.com/dotnet/core/extensions/configuration
https://docs.microsoft.com/dotnet/core/extensions/logging

Le parti pris de Lepo Wpf.UI est de ne pas utiliser Prism et cela va nous permettre de comparer les différentes architectures.

Là on est au cœur de la structuration ou architecture des applications Microsoft .NET.

Le début de la documentation concernant l'architecture des applications WPF :

Microsoft Learn - Vue d’ensemble des bibliothèques runtime

Avec Prism on a des UserControl avec CommunityToolkit.Mvvm Page

Prism UserControl vs CommunityToolkit.Mvvm Page

La Navigation est le premier sujet Wpf.Ui Lepo propose déjà trois Templates avec des modes de navigation, MS Store, Fluent et Compact...

Curieusement les trois Templates sont tout à fait équivalents aucun avec Prism.

TemplateStudio

La Navigation avec Prims semble plus simple, plus intégrée, le répertoire Services est moins rempli.

Configuration

Microsoft.Extensions.Hosting est remplacé par Prism.IoC.IContainerregistry.

To Be Continued...

Quel Template de modern UI pour WPF ?

Je viens de passer du temps avec Microsoft Template Studio qui installe un Template de modern UI autour de MahApps.Metro pour WPF avec plein d'autres fonctionnalités.

Alors existe t-il d'autres templates de modern UI pour WPF ? 

WPF modern UI Frounisseurs

Dans WPF, comme fournisseurs d'UI moderne et composants graphiques, on retrouve classiquement :

Telerik.com

Infragistics/products/WPF

DevExpress

...

WPF modern UI Gratuits

On va essayer de trouver quelques bons projets de WPF Modern UI. Pour l'instant pas de classement mais une découverte rapide des différentes solutions qui nous sont proposées.

Kiranna ModernWPF

GitHub - Kinnara/ModernWpf

Kinnara/ModernWpf est un travail très intéressant et très important, autour des pacakges UI dédiés à WPF. Il part du framework de base Microsoft.WindowsDesktop.App.WPF pour réaliser une application complète de contrôles utilisateur AutomationPeer.

Un de ses projets utilise (est dépendant de) le package MahApps.Metro mais pas les autres.

Une série de Samples démontrent l'utilisation de Fluent.Ribbon, Dragablz, FluentWPF, MahApps.Metro.

\\Visual Studio 2022\Samples\Kinnara-ModernWPF\ModernWPF Net6-7\ModernWPF\ModernWpf.SampleApp\ModernWpf.SampleApp.csproj

Voici un exemple de la Gallery :

WPF UI - ModernWpf.SampleApp
WPF UI - ModernWpf.SampleApp

Intégration du Package MahMetro :

\\Visual Studio 2022\Samples\Kinnara-ModernWPF\ModernWPF Net6-7\ModernWPF\samples\MahAppsSample\MahAppsSample.csproj

ModernWPF- MahAppsSample
ModernWPF- MahAppsSample

Une véritable mine d'or pour ceux qui souhaitent maîtriser WPF UI la plus part des ressources viennent de MahApps mais pas seulement.

If you need the ModernWpf from Yimeng Wu for .NET 6.0 or .NET 7.0 It's here in Discussion Tab :

GitHub - Kinnara/ModernWpf - Discussion #513 Net 6 and Net 7

Un travail très intéressant d'évolution de la solution vers .NET 6.0 et .NET 7.0 qui donne une idée du travail à effectuer pour migrer une application depuis les anciens frameworks vers .NET 6.0.

MahApps.Metro

C'est le projet utilisé par Microsoft TemplateStudio pour WPF et d'autres ...

Github - MahApps/MahApps.Metro

Pour l'instant, je n'arrive pas encore à exécuter ce projet sur ma plateforme de développement à cause d'une référence au framework 4.7 ... que je ne souhaite pas installer, bref... je prends le code de release :

https://github.com/MahApps/MahApps.Metro/releases 2.4.9, je supprime "net47" dans les propriétés des projets et ça fonctionne : 

MahMapps.Metro elegant WPF UI

Vous pouvez trouver la structure des NuGets MahApps.Metro dans le projet :

https://github.com/MahApps/MahApps.Metro/wiki/Visual-Studio-Templates

Pour démarrer rapidement avec MahApps.Metro c'est ici :

MahApps - Guides Quick-start - Installation

Mais alors vous démarrez tout en bas, avec un NutGet et le Guide pour créer votre première page MetroWindow :

Install Nuget MahApps.Metro
Install Nuget MahApps.Metro for WPF solution

Mais croyez moi il du chemin à faire pour obtenir une application WPF digne de ce nom.

Fluent.Ribbon

C'est le projet de Base a utiliser, si vous souhaitez développer une application WPF autour d'un "Ribbon" un Ribbon est bien plus qu'un ruban, c'est un menu Windows Office Like c'est donc un menu extrêmement efficace pour lancer tout un tas de commandes depuis ce Ribbon.

Github -Fluent.Ribbon.Showcase

Voici l'interface UI du projet Fluent.Ribbon exécutée par Visual Studio 2022 Community :

Fluent.Ribbon WPF UI
Fluent.Ribbon WPF UI

Le problème étant que ce Ribbon est très "Windows Like" aujourd'hui on préférera des menus plus simples.

Mais ce projet est une mine d'or pour les développeurs WPF car il met en oeuvre un nombre incalculable de techniques pour développer une belle UI pratique.

WPF UI Fluent Modern Lepo

WpfUI/lepo

GitHub - lepoco - wpfui

C'est dans la même vaine, un projet très complet avec Extension, Template d'application WPF.

Open source dans le GitHub, respect des licences :

https://github.com/lepoco/wpfui/tree/main/src/Wpf.Ui

Quel model MvvM ? WPF UI Lepoco n'utilise pas Prism c'est le CommunityToolkit.Mvvm

De très intéressants Scripts dans le répertoire :

https://github.com/lepoco/wpfui/tree/main/scripts

Si vous souhaitez exécuter la Solution Wpf.Ui.Demo avec Visual Studio 2022 et .NET 6.0, il vous suffit de supprimer les références aux frameworks ;netcoreapp3.1;net48;net472;net462

Dans le fichier : /Wpf.Ui/Wpf.Ui.csproj :

<TargetFrameworks>net7.0-windows;net6.0-windows;netcoreapp3.1;net48;net472;net462</TargetFrameworks>

Exécution du projet Wpf.Ui.Demo.Mvvm.csproj :

Modern UI WPF Lepoco - Wpf.Ui.Demo.sln
Modern UI WPF Lepoco - Wpf.Ui.Demo.sln

Exécution du projet Wpf.Ui.Gallery.sln :

ModernWPF UI Leco.co Gallery
ModernWPF UI Leco.co Gallery

C'est un projet extrêmement impressionnant avec une quantité de codes source gigantesque pour faire fonctionner tout cela.

J'ai installé l'extension WPF UI :

https://marketplace.visualstudio.com/items?itemName=lepo.wpf-ui

Dans Visual Studio 2022 :

WPF UI lepo.co
WPF UI lepo.co

C'est vraiment très complet, voici la structure du Template d'Application : 

WPF UI Lepo.co
WPF UI Lepo.co

On a vraiment un très beau et très complets Template d'application WPF.

Adonis UI

Adonis UI/Lightweight UI toolkit for WPF

benruehl/adonis-ui: Lightweight UI toolkit for WPF applications offering classic but enhanced windows visuals

Semble prometteur tout en bas de la page une Demo à télécharger.

To Be Continued...

WPF Modern UI - Conclusion

Me voilà avec des tonne de code sources d'exemples pour créer mon application WPF.

Je vais continuer de cherche d'autres exemples de Modern UI Template mais je peux déjà dire que j'ai atteins mon objectif, consolider mes connaissances en développement d'applications WPF modernes. Il y a du chemin de parcouru par les communautés ... depuis silverlight ;-))

Je vais également étudier de plus prêt tout le code fournit avec ces exemples de Modern UI for WPF pour en décrire la structure ou l'architecture Navigation, Configuration, MvvM, etc.

A la découverte de Microsoft Template Studio for WPF

Quels sont les sujets abordés et résolut par le TemplateStudio en WPF ? C'est la question que je vais me poser ce matin.

Je choisi un projet type ribbon prism et WPF, et je me rends compte que le Ribbon ne fonctionne pas, du moins, il est vide. C'est le côté didactique de Template Studio, il faut le remplir selon la page d'aide suivante :

Github - Microsof - TemplateStudio - WPF- ribbon

Mais je me suis fait avoir pas cette page qui implémente le Fluent.Button dans ListDetailsPage.xaml tandis que, ce que l'on souhaite faire, c'est créer un bouton dans le Ribbon qui permette d'afficher la page ListDetailsPage.xaml et les autres pages choisies dans le Wizard du TemplateSutdio.

Il faut donc implanter le Fluent.Button dans ShellWindow.xaml et la ICommand dans ShellViexModel.cs. 

Ce qui donne le résultat suivant :

TemplateStudio for WPF with Ribbon button implemented
TemplateStudio for WPF with Ribbon button implemented

Ceci fait, j'aimerais avoir des icônes pour les boutons des autres pages et je suppose que l'on peut par exemple récupérer les icônes du Template Navigation Pane qui sont dans :

GitHub - MahApps.Metro framework that allows a better UI for their own WPF

Comme indiqué dans :

GitHub - TemplateStudio - WPF - navigationpane

MahApps.Metro est un vaste sujet. On aura remarqué que dans notre Template WPF la ShellWindow est une MetroWindow.

Je cherche maintenant à intégrer des Icones dans mon Ribbon pour afficher les autres images pages que j'ai choisies dans mon wizard de TemplateStudio.

La navigation dans TemplateStudio WPF NavigationPane se fait par un : HamburgerMenu

<controls:HamburgerMenu
    ItemsSource="{Binding MenuItems}"
    ItemCommand="{Binding MenuItemInvokedCommand}"

Dont la propriété ItemSource est bindée sur une magnifique ObservableCollection :

    public ObservableCollection<HamburgerMenuItem> MenuItems { get; } = new ObservableCollection<HamburgerMenuItem>()
    {
        new HamburgerMenuGlyphItem() { Label = Resources.ShellMainPage, Glyph = "\uE8A5", Tag = PageKeys.Main },
        new HamburgerMenuGlyphItem() { Label = Resources.ShellListDetailsPage, Glyph = "\uE90C", Tag = PageKeys.ListDetails },
        new HamburgerMenuGlyphItem() { Label = Resources.ShellContentGridPage, Glyph = "\uE774", Tag = PageKeys.ContentGrid },
        new HamburgerMenuGlyphItem() { Label = Resources.ShellDataGridPage, Glyph = "\uE707", Tag = PageKeys.DataGrid },
    };

On pourrait faire de même pour le modèle ribbon mais ! On a du mal à implanter une iconPacks dans le Fluent:Button d'un Fluent:RibbonGroupBox :

<Fluent:RibbonGroupBox
                        State="Large"
                        MinWidth="150"
                        Header="GroupBox 1">
                        <!--_BRY_ NE MARCHE PAS-->
                        <Fluent:Button
                            Size="Large"
                            Command="{Binding OptionsMenuItemInvokedCommand}">
                            <iconPacks:PackIconControl Kind="{x:Static iconPacks:PackIconMaterialKind.AccessPoint}"
                                   Width="48"
                                   Height="48" />
                        </Fluent:Button>
                    </Fluent:RibbonGroupBox>

Ce la ne fonctionne pas ! Les propriétés de l'objet Fluent:Button ne le permettent pas.

Fluent.Ribbon pour Template Studio 

Allons voir chez Fluent.Ribbon ce que nous avons :

GitHub - Fluent.Ribbon: WPF Ribbon control like in Office

Étonnant ce GitHub, cela fait deux fois que je vois une documentation propre sur un site dédié mais abandonnée tandis que la documentation du projet se poursuit dans le GitHub.

Alors avec Fluent.Ribbon, il on essayé GitHub Pages & Jekyll pour la documentation... 

Fluent.Ribbon.github.io

Moi aussi :

My site with Github Pages & Jekyll | Mabyre’s page

Le problème du ShowCase de Fluent.Ribbon, c'est qu'il faut installer un tas de vieux trucs dont on aura pas besoin :

Sur ma plate forme actuelle Visual Studio 2022 .NET 6.0 :

Installations à effectuer pour travailler avec le ShowCase de Fluent.Ribbon
Installations à effectuer pour travailler avec le ShowCase de Fluent.Ribbon

Sur mon bon vieux Visual Studio 2019 .NET Framework 4.8

Installations à effectuer pour travailler avec le ShowCase de Fluent.Ribbon

Franchement, je vais vous dire, je ne suis pas chaud...

D'autant que la version 10.0 va bientôt sortir :

Github - Milestones - Fluent.Ribbon

Il est urgent d'attendre... la prochaine Mise à jour de Fluent Ribbon pour l'essayer avec le dernier Visual Studio 2022 et le .NET 6.0.

WPF Prism Ribbon TemplateStudio on GitHub

Pour développé un Template Studio Project WPF ayant fait le choix dans le Template Studio Wizard, de la Navigation avec Ribbon, du Framework Prism pour le côté MvvM et plus, avec en plus quelques pages d'essais et des exemples, voici mon projet dans le GitHub :

GitHub - mabyre/WpfAppRibbonTemplateStudio

Nous pourrons ainsi parfaire nos connaissances.

N'hésitez pas à partager et à liker, à venir dans le github mettre une petite étoile.