Universal Windows Plateform - OCR vers MAUI

Je recherche l'état de l'art en matière de reconnaissance de caractères OCR. Et je trouve cet exemple pour UWP (Universal Windows Plateform) :

GitHub - UWP - OCR

Je télécharge Zip et j'ouvre la solution avec Visual Studio 2022 pour l'exécuter :

UWP - OCR - Exécution
UWP - OCR - Exécution

Je peux (1) ouvrir une image au format .jpg .jpeg .png et (2) lancer la reconnaissance de caractères pour en extraire le texte :

Lancer la reconnaissance de caractère sur une image
Lancer la reconnaissance de caractère sur une image 

Je peux alors copier et coller dans une autre application le texte extrait de l'image (1). C'est vraiment bluffant.

Mais maintenant j'aimerais embarquer ces fonctionnalités dans une application MAUI. Est ce que cela est possible ?

Je pars de MAUI ToolKit 

GitHub - mabyre MauiAppToolkit

Je créé une page : OpticalRecogPage.xaml.cs

J'ajoute un ButtonExtract et je tente d'instancier l'objet OcrEngine qui me permet dans les applications UWP de faire de l'OCR et après je laisse l'Intellisens me résoudre mon problème de package :

OCR avec MAUI
OCR avec MAUI

Mais quand je demande à ChatGpt si c'est une bonne idée il me dit que : "Uno.UI est une plateforme open source pour la création d'applications natives multiplateformes avec XAML et C#. Cependant, Uno.UI en soi ne fournit pas de fonctionnalités OCR."

ChatGpt propose deux libraires : Tesseract OCR, et IronOCR

Du coup dans les packages je trouve : 

MAUI use Tesseract OCR
MAUI use Tesseract OCR

Et voilà c'est parti pour faire la reconnaissance de caractère avec MAUI pour aller jusque sur le smart téléphone ...







MAUI - Multiplateformes Applications UI Advance Development

Maintenant que nos bases de développement MAUI sont bien établies que nous avons mis en place l'environnement de développement. Cherchons un peu ce que l'on pourrait trouver en développement avancé, c'est à dire des exemples un peu avancé d'applications développées avec MAUI.

GitHub DotNET - MAUI Samples

Microsoft DotNET - Podcast

Voilà un développement intéressant, extrêmement complet autour de la diffusion de Podcast :

GitHub - microsoft - dotnet-podcasts

Voici un exemple avancé, de développement d'application avec MAUI, voir très avancé ...

Il y a un diagramme d'architecture assez complexe avec des Containers, des App hybrides, Blazor, Signal R, app services, SQL Azure, la totale : 

GitHub Microsoftdotnet-podcasts Application Architecture Diagrams

pas piqué des hannetons, une Whaou application avec MAUI.

we build an app to listen to all your favorite .NET podcasts for all the ecosystems: Web, Android, iOS, macOS and Windows. You can find the different apps separated by folders in this repo ...

.NET MAUI Samples

En repartant de la page :

https://github.com/dotnet/maui-samples

d'ailleurs DotNET Podcast fait partie des projets référencés sur cette page.

Je trouve aussi :

GitHub jsuarezruiz - dotnet-maui-showcase - .NET MAUI goodlooking UI Samples

Répertoire des UI réalisée pour le MAUI UI Challenge ...

Alors là, comment dire, c'est pas une application mais plutôt de la doc, c'est un ce que je reproche maintenant à GitHub au début on ne pouvait quasiment pas faire de doc mais que du code en gros. Et maintenant on peut faire que de la doc. Bon c'est ainsi.

Et encore :

GitHub jsuarezruiz awesome-dotnet-maui

Un répertoire de tout plein de choses utiles pour développer avec MAUI.


CommunityToolkit Maui - Module SpeechToText

Ce qui est très fort maintenant avec GitHub c'est que vous pouvez suivre en direct les développements de la Community Open Source.

Donc ce matin, je reprends mes développement avec .NET Maui et je me rends compte que dans CommunityToolkit.Maui.Samples que je n'ai pas la page Pages.Essentials.SpeechToTextPage. Cela signifie que je suis sur la branch main mais que des commits ont été réalisés depuis.

Je me promène dans mon Fork en remontant les commits jusqu'à ce je vois apparaître la Page SpeechToTextPage.xaml. Puis je fais un Checkout et là je vois toutes les différences qui ont conduit à la livraison d'un exemple du module SpeechToText dans CommunityToolkit Maui :

Commit SpeechToText #808 (#1127)

Dans les Changes, je vois tout le code que Vladdislav Antonyuk a ajouté pour livrer le module SpeechToText.

Je ne sais pas vous mais moi, je trouve cela très instructif ....

Ce que j'aimerais faire, c'est isoler ce développement, le comprendre pour intégrer une page SpeechToText dans mon application :

GitHub mabyre - MauiAppToolkit

MauiProgram.cs

Commençons par le commencement la création de l'application Maui dans MauiProgram.cs

Utilisation de :

using CommunityToolkit.Maui.Media;

pour l'ajout des deux services : SpeechToText et TextToSpeech

On vérifie que l'application fonctionne toujours.

Integrate module SpeechToText

La suite dans le GitHub :

GitHub Mabyre - MauiAppToolkit#integrate-speech-to-text

Remarque sur la difficulté de l'exercice ... Le plus dur (long) fut de corriger les erreurs générés par le code auto-généré ... 

Lors du déplacement de la page (view) :

MauiAppToolkit/SpeechToTextPage.xaml

Le code généré par les directives du Xaml est en erreur !? 

Le moyen de s'en sortir (le mien) j'ai modifié les namespace puis je les ai remis les erreurs ont disparues.

Sur un stach de la banche integrate-speeh-to-text vous verrez une tentative de supprimer BasePage.cs et ce n'est pas joli joli.

Pareil, j'ai essayé de renommer BasPage en BaseView qui me paraissait bien plus adapté à mon projet cela ne fonctionne pas. Je me demande s'il n'y a pas une interaction entre ce BasePage et CommunityToolkit.Maui... 

Mais voilà sinon c'était sympathique, ce petit moment de codage...

N'hésitez pas à commenter.




Développement .NET MAUI stabilité de la plateforme de développement

Je développement avec Visual Studio Community 2022 et MAUI le successeur de Xamarin ... Et je vois devant moi la plateforme prendre des initiatives comme ajouter des Using fantaisistes pour compléter le code que je suis en train d'écrire.

Je suis surpris, je trouve cela un peu trop intrusif d'autant que vous ajoutez un using par ci par là mais la plateforme joue aussi beaucoup avec les packages qu'elle installe aussi automatiquement en fonction des projets que vous ouvrez.

Alors tout ceci est-il bien stable ? C'est une question dont je viens d'avoir la réponse.

Trouble shooting using MAUI plateforme

Voici la réponse à la question, la plateforme de développement Microsoft .NET MAUI est-elle stable ?

La plateforme de développement Microsoft .NET MAUI est-elle stable ?
La plateforme de développement Microsoft .NET MAUI est-elle stable ?

Cela fait déjà un petit moment que je trouve les initiatives de la plateforme ... comment dire ... mal à propos. Et ce matin voilà ça y est c'est planté !

Ce matin, j'ai bien peur de retomber dans :

L'Enfer du DotNET !

Alors trouvons des solutions au maintient d'une plateforme stable.

Error dans Xamarin Tools

Pourquoi Xamarin ? Je croyais que l'on en avait plus besoin...

1 - C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\33.0.46\tools\Xamarin.Android.Aapt2.targets

Une erreur avec Xamarin, alors c'est curieux parce qu'il est stipulé lorsque vous débutez MAUI que c'est le successeur de Xamarin mais qui n'a pas besoin de Xamarin d'ailleurs quand vous installez le Développement .NET MAUI Xamarin est facultatif certainement pour migrer des anciens projets Xamarin vers MAUI.

Xamarin est-il nécessaire à la MAUI Plateforme ?
Xamarin est-il nécessaire à la MAUI Plateforme ?

Une fois de plus je vais trouver la solution mais c'est navrant de constater que ce n'est pas encore sec sec sec tout ça. Il y a surement encore des liens trop ténus avec Xamarin et sa foultitude de tools qui ne fonctionnent pas.

Bien sûr, je vais vous trouver une solution, stay tude.

Erreur NU1105 - Impossible de lire les informations du projet

Voici cette nouvelle instabilité de ma plateforme de développement, en général quand ce genre de message apparaît alors que vous ne pensez pas avoir fait quoi que ce soit, c'est au moins la demi-journée pour trouver la correction sauf si vous avez de la chance. 

Impossible de lire les informations relatives au projet pour 'MauiAppToolkit' :
La séquence contient plusieurs éléments ...

Voici l'erreur du jour, elle je vous assure elle est coton car la solution n'est pas évidente. J'ai un fichier project.assets.json qu in'est pas généré correctement.

Hummm l'erreur Visual Studio qu'elle pue la mmm
Hummm l'erreur Visual Studio qu'elle pue la mmm

Alors que s'est-il passé ? D'après moi c'est d'avoir ouvert la solution avec Visual Studio 2019 qui a commencé à bricoler tenter de faire des mise à jour alors que la Solution MAUI ne peut s'ouvrir qu'avec Visual Studio 2022 !

Je supprime bien sur les .\bin et .\obj rien n'y fait.

Je recherche du côté de la suppression des NuGets dans les répertoire :

C:\Users\Mabyre\.nuget\

Je supprime Tout !

Je regarde dans :

C:\Program Files (x86)\Microsoft SDKs\NuGetPackages

Rien n'a à voir avec Maui ou Community, je ne supprime pas !

C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages

Il n'y a rien là dedans !

Alors je vais du côté de : 

Outils -> Options -> Gestionnaire de package NuGet -> Général

Gestionnaire de packages Nugets

Je clique sur :  Effacer tout le stockage NuGet. C'est peut être ça qui à corrigé le problème ...

Dans la fenêtre de sortie :

Effacement du cache HTTP NuGet : C:\Users\Mabyre\AppData\Local\NuGet\v3-cache
Effacement du dossier des packages globaux NuGet : C:\Users\Mabyre\.nuget\packages\
Effacement du cache temporaire NuGet : C:\Users\Mabyre\AppData\Local\Temp\NuGetScratch
Effacement du cache des plug-ins NuGet : C:\Users\Mabyre\AppData\Local\NuGet\plugins-cache
Ressources locales effacées.
========== Fin ==========

Je créé une nouvelle solution en ouvrant directement le fichier .csproj. Je quitte en sauvegardant la solution. 

Puis, une idée de génie je tente d'exécuter quand même la solution malgré les erreurs, voilà ma solution devant moi en train de s'exécuter. Du coup j'aimerais remettre la solution dans le répertoire racine du projet mais voilà :

Error AndroidManifest.xml

Bon voilà c'est corrigé :

GitHub - Mabyre - MauiAppToolkit

Crash de la Plateforme de développement MAUI

Voilà le problème précédent corrigé, qu'un nouveau crash se produit ...

Erreur : ApplicationId 'com.companyname.mauicameramauisample' was not a valid GUID. Windows apps use a GUID for an application ID instead of the reverse domain used by Android and/or iOS apps. Either set the <ApplicationIdGuid> property to a valid GUID or use a condition on <ApplicationId> for Windows apps. MauiCameraMauiSample C:\Program Files\dotnet\packs\Microsoft.Maui.Resizetizer.Sdk\7.0.86\targets\Microsoft.Maui.Resizetizer.targets 655

C:\Program Files\dotnet\packs\Microsoft.Maui.Resizetizer.Sdk\7.0.86\targets\Microsoft.Maui.Resizetizer.targets(655,9): error : ApplicationId 'com.companyname.mauicameramauisample' was not a valid GUID. Windows apps use a GUID for an application ID instead of the reverse domain used by Android and/or iOS apps. Either set the <ApplicationIdGuid> property to a valid GUID or use a condition on <ApplicationId> for Windows apps.

Une petite fenêtre très sympathique VCManagePackage :

Allé encore, cette fois également ça sent mauvais... Bon comme il y a une mise à jour Visual Studio et bien allons y mettons à jour 17.6 en 17.7 je crois.

Erreur NETSDK1112 le pack de runtime pour Microsoft.NETCore.App.Runtime.win-x64 n'a pas été téléchargé. Essayez d'exécuter une restauration NuGet avec le RuntimeIdentifier 'win-x64'. MauiCameraMauiSample C:\Program Files\dotnet\sdk\7.0.304\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.FrameworkReferenceResolution.targets 448

Un petit coup de PowerShell :

PS>dotnet restore --runtime win-x64

L'erreur Erreur NETSDK1112 est corrigé mais pas l'autre. Pour corriger l'autre j'ai du ajouter :

<ApplicationIdGuid>dafdd4e2-67de-4a3e-9f4f-196e13fb1bd1</ApplicationIdGuid>

Dans le fichier projet .csproj de la solution... rien de moins que de bricoler le fichier .csproj à la mimine.

Erreur AMM0000

Et cela continue !

Erreur AMM0000 uses-sdk:minSdkVersion 19 cannot be smaller than version 21 declared in library C:\Users\Mabyre\Documents\Visual Studio 2022\Samples\MAUI\MauiAppToolkit\MauiAppToolkit\obj\Debug\net7.0-android\lp\133\jl\AndroidManifest.xml as the library might be using APIs not available in 19

Suggestion: use a compatible library with a minSdk of at most 19,

or increase this project's minSdk version to at least 21,

or use tools:overrideLibrary="androidx.security" to force usage (may lead to runtime failures)

Directory 'obj\Debug\net7.0-android\lp\133' is from 'androidx.security.security-crypto.aar'. MauiAppToolkit C:\Users\Mabyre\Documents\Visual Studio 2022\Samples\MAUI\MauiAppToolkit\MauiAppToolkit\obj\Debug\net7.0-android\AndroidManifest.xml 46

J'avoue cela me fatigue un peu ...

Du coup j'ai supprimé la ligne :

<uses-sdk />

Du fichier :

\MauiAppToolkit\Platforms\Android\AndroidManifest.xml

Et ça fonctionne à nouveau.

.NET 6.0 & .NET 7.0

Ce matin, je travaille sur mon MAUI Application Toolkit pas de soucis. Et puis, je ne sais pour qu'elle raison saugrenue, j'ai eu envie d'essayer le projet suivant :

https://github.com/henduck/MAUINewsApp.git

Je clone, j'ouvre la solution, je laisse la génération se dérouler et

BOOUUUUMMMMMMM !!!

Erreur	NETSDK1005	Le fichier de composants '\Visual Studio 2022\Samples\MAUI\MauiAppToolkit\MauiAppToolkit\obj\project.assets.json' n'a aucune cible pour 'net7.0-windows10.0.19041.0'
Erreur NETSDK1005 Le fichier de composants '\Visual Studio 2022\Samples\MAUI\MauiAppToolkit\MauiAppToolkit\obj\project.assets.json' n'a aucune cible pour 'net7.0-windows10.0.19041.0'

Message d'erreur :

Erreur NETSDK1005 Le fichier de composants '\MauiAppToolkit\obj\project.assets.json' n'a aucune cible pour 'net7.0-windows10.0.19041.0'. Vérifiez que la restauration s'est exécutée et que vous avez inclus 'net7.0-windows10.0.19041.0' dans TargetFrameworks pour votre projet. MauiAppToolkit C:\Program Files\dotnet\sdk\7.0.304\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets

Ça fait toujours bien dans le SEO du post de mettre le message d'erreur !

Je suppose que l'erreur fut générée par la restauration du projet en .NET 6.0 alors que le projet MauiAppToolkit est déjà en .NET 7.0.

Je découvre :

GitHub Redth - dotnet-maui-check

J'exécute tout ce qu'il faut ça prend du temps plusieurs minutes :

Exécution de .NET MAUI Check
Exécution de .NET MAUI Check 

Dommage on dirait pourtant que tout va bien mais rien à faire :

Erreur NETSDK1005 Le fichier de composants 'C:\Users\Mabyre\Documents\Visual Studio 2022\Samples\MAUI\MauiAppToolkit\MauiAppToolkit\obj\project.assets.json' n'a aucune cible pour 'net7.0-android'. Vérifiez que la restauration s'est exécutée et que vous avez inclus 'net7.0-android' dans TargetFrameworks pour votre projet. MauiAppToolkit C:\Program Files\dotnet\sdk\7.0.304\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets 266

Et puis à force de lire ce message d'erreur 'restore' m'enfin oui bien sûr il y a la commande :

Commande PowerShell > DotNET Restore

PS C:\Users\Mabyre\Documents\Visual Studio 2022\Samples\MAUI\MauiAppToolkit>dotnet restore

Cela prend du temps mais au bout PowerShell me répond "Restauration effectuée en 3,55 min et cette fois cela y est mon application fonctionne à nouveau.

Have a nice day! I'll go to the beach!

Découvrir rapidement MSTest et faire du TDD

Alors depuis toujours je fais des Tests, des TU, des TI et même des TV, évidemment ;) Mais après la découverte du Software Craftsmanship et ce concept de développement logiciel, me voici en train de me remettre à jour sur les Tests.

Pour moi, il n'y a aucune raison de ne pas choisir MSTest V2.

Voici mon projet MSTest de démarrage :

GitHub - dotnet/samples/tree/main/core/getting-started/unit-testing-using-mstest

J'ouvre la solution : unit-testing-using-mstest.sln

En suite, je lance les trois commandes pour installer les packages dans PowerShell :

PS>Install-Package MSTest.TestAdapter
PS>Install-Package MSTest.TestFramework
PS>Install-Package Microsoft.NET.Test.Sdk

Une fois les packages installés, tout se passe dans le menu Test de Visual Studio :

MSTest avec Visual Studio
MSTest avec Visual Studio

Tout se trouve dans la fenêtre suivante :

MSTest exécution dans la fenêtre de Visual Studio
MSTest exécution dans la fenêtre de Visual Studio

En 1 : Je trouve les Annotations et notamment DataRow qui indique simplement que le test sera exécuté avec comme paramètre la valeur -1 puis 0 puis 1.

En 2 : J'exécute tous les tests, ils sont au vert.

Lambdatest - MSTest Framework Tutorial Using .Net Core

Et voilà, c'est parti pour le TDD ! Maintenant, quand je vais concevoir mon soft, je vais d'abord penser aux tests qu'est ce que je voudrais que mon logiciel passe comme tests.

Don't forget to go to the beach!

MAUI - Comment déployer mon application sur les différentes plateformes

Je développe mon application MAUI depuis quelques jours déjà. Je lance son exécution depuis Visual Studio mais j'ai remarqué un exécutable. Je me retrouve avec un EXE sur lequel quand je clique dessus... Rien ! Absolument rien...

Je regarde Ici :

Microsoft Learn - .NET MAUI - Déboggage sur Windows

Et rien le mode développeur était déjà activé sur ma machine ;-)

Pour développer n'oubliez pas ce cocher le "Mode développeur"
Pour développer n'oubliez pas ce cocher le "Mode développeur"

Alors avec MAUI quand je clique sur l'EXE il ne se passe rien.... Je tombe sur un tas de site obscures qui m'explique que l'extension .EXE n'est pas associée au bon fichier.

Microsoft Learn -.NET MAUI - Publish app to a folder for Windows

C'est tout un bazar, comme d'hab ... créer un coffre avec des clefs dans l'Azure Cloud mais cela peut coûter, il vous faut choisir un mode de paiement.

Donc je créé un Certificat ...

Et puis le bazar continue ...

Déployer mon application MAUI
Déployer mon application MAUI

Error :

Impossible de vérifier le certificat d’éditeur de ce package d’application. Contactez votre administrateur système ou le développeur d’applications pour obtenir un nouveau package d’application avec des certificats vérifiés. Le certificat racine et tous les certificats immédiats de la signature dans le package d’application doivent être vérifiés (0x800B010A)

Vous souhaitez aller au bout du déploiement de votre application MAUI ?

J'ai la solution, n'hésitez pas à me contacter ;)

That's All Folks!

MAUI - Editor Keyboard ne fonctionne pas sous WinUI ?

Ce matin un lapin... ou plutôt un loup, ce loup c'est le MAUI Editor ! Je lance mon application MAUI préférée :

GitHub - Mabyre - MauiAppToolkit

Je clique dans l'Editor pour essayer de modifier le Texte en tapant quelques caractères au clavier mais cela ne fonctionne pas, seuls quelques caractères passent pas les retours chariots :

Mon MAUI Application Microsoft préférée
Mon MAUI Application Microsoft préférée

Comme la deuxième page "Console" est aussi un Editor pour la Console de messages, j'y vais, et là l'Editor fonctionne ... je peux écrire ce que je veux dedans.

Mon MAUI Application Microsoft préférée
Mon MAUI Application Microsoft préférée

Vous comprenez mon désarrois.

Je relance l'application depuis le début, je tente d'écrire dans l'Editor je ne vois pas les caractères que j'ai tapés jusqu'à ce que je rafraîchisse la page par exemple dans changeant sa taille et là je vois les caractères que j'ai tapés au clavier.

Peut-on dire que le contrôle utilisateur MAUI Editor est beugué sous Windows ?

Je reviendrais vous donner la réponse. En attendant, si le développement MAUI vous intéresse n'hésitez pas à me contacter.

Je ne sais pas bien pourquoi le Keypad "s'est bloqué" peut être un coup de InputDirector va savoir oui parce que je partage ma souris et mon clavier pour piloter 


Développement avec .NET MAUI (Multi-platform App UI) - Le graal ?

Me voici plongé dans le développement avec la technologie MAUI de Microsoft.NET et pour l'instant tout va bien ma petite application qui ouvre un fichier pour l'afficher, le modifier et le sauvegarder, va très bien, c'est très fun! Je trouve même le moyen de particulariser l'AppIcon.

GitHub - Mabyre - MauiAppToolkit

Jusqu'à ce que je déploie mon application sur mon téléphone Android. Là encore c'est très fun, le lien de débeug entre ma plateforme de Dev (Visual Studio Community 2022) et mon Cellular est parfaite je peux déboguer mon application tournant sur mon Cellular et je step le code depuis mon Visual.

Trop fort.

Mais quand je souhaite sauvegarder mon fichier, plouf ! Rien !

Alors en cherchant un peu, je trouve :

.net MAUI write to external storage - Stack Overflow

Et là je rigole bien, le pauvre, sa question n'intéresse personne et il n'y a pas de réponse à son problème parce que la réponse est trop vaste.

Une partie de la solution se trouve dans le Commit :

GitHub - try to find solution on storage problem - MauiAppToolkit@81339a5

MAUI - File - External Storage

C'est un vrai problème en effet. La difficulté, c'est que le FilePicker ne result pas le chemin réel du fichier Pické. Sur Android, il s'agit d'un chemin fictif menant au cache donc lorsque vous sauvegardez le fichier que vous avez modifié il est dans le cache !

/storage/emulated/0/Android/data/com.companyname.mauiapptoolkit/cache/2203693cc04e0be7f4f024d5f9499e13/92c9d622ed3d489a8a37b988f0c003c1/

Alors comment faire ?

Autre difficulté le FilePicker ne prend pas de Path en paramètre, il va où il veut...

Le début de la solution certainement Ici :

Microsoft Learn - FolderPicker - .NET MAUI Community Toolkit

Alors qu'avons-nous dans CommunityToolkit.Maui.Storage :

CommunityToolkit.Maui.Storage

A comparer avec Microsoft.Maui.Storage :

Microsoft.Maui.Storage

Donc pour ma part j'ai trouvé ce qu'il faut faire. Vous souhaitez en savoir, plus n'hésitez pas à me contacter les réseaux sont là pour ça.

SoDevLog - Prestations

That's All Folks!




C'est quoi .NET MAUI (Multi-platform App UI) ?

La dernière nouveauté des frameworks .NET de Microsoft, c'est maintenant .NET MAUI. Alors allons y démarrons le développement de notre application avec .NET MAUI. Ce qui est vraiment cool maintenant avec Microsoft, c'est que c'est gratuit et open source.

Learn Microsoft - Qu’est-ce que .NET MAUI ?
Learn Microsoft - Qu’est-ce que .NET MAUI ?

.NET MAUI serait-il enfin le Graal ? L'environnement de développement Multiplateforme, un seul code et la possibilité de déployer pour toutes les plateformes, iOS, Android, Windows, Mac, Linux, ...

C'est parti !

Téléchargez Visual Studio 2022, et cochez la case Développement .NET Multi-Platform App UI :

Microsoft .NET MAUI
Microsoft .NET MAUI

Et voilà c'est partie, alors je vois la mise à jour possible de Visual Studio 2022 17.5 vers 17.5.4 avec tout un tas de choses concernant .NET MAUI donc mise à jour de Visual Studio 2022 en version 17.5.4.

Learn Microsoft - Exemples de Codes MAUI

Donne un panel de ce qu'il va falloir débroussailler. 

Je créé mon premier Template d'application, j'ai deux possibilités soit rien, soit Blazor ... Pour l'instant, je choisie rien.

Je dois créer un émulateur Android :

.NET MAUI - Exécution de l'application

Voici toutes les possibilités pour exécuter mon application MAUI des émulateurs des simulateurs cela semble prometteur en tous plus qu'au début de Xamarin où cela ne fonctionnait pas bien ...

Me voilà donc en train d'installer un simulateur Android :

Visual Studio 2022 - Installation du Simulateur Android
Visual Studio 2022 - Installation du Simulateur Android

C'est long ... sur mon AMD Radzen 5 3500U 2.10 GHz.

Au moment de cliquer sur le bouton "Démarrer" :

Hyper-V n'est pas configuré
Hyper-V n'est pas configuré

Il faut activer une nouvelle fonctionnalité de Windows :

Learn Microsoft - Accélération matérielle pour les performances de l’émulateur (HaXM Hyper-V & )

Alors on ne se souvient jamais, puisque les ingés de Redmond changent tout le temps, où se trouve les fonctionnalités de windows, seulement la doc est un peu vieille, moi voici ce que j'ai à la place, j'ai tapé dans  la recherche "fonctionnalités de windows" et voici  :

Fonctionnalités de Windows - Prise en charge de l'accélération Hyper-V
Fonctionnalités de Windows - Prise en charge de l'accélération Hyper-V

Je coche la case et je relance l'exécution de mon application. C'est long, mais au bout de quelques minutes, voici ce que j'obtiens :

Androi Emulator pixel_5

Quelques instants après, mon App MAUI s'exécute et j'obtiens le résultat suivant :

MAUI sur Emulator Android - Hello, World!

Ce n'est que le début, cette expérience ressemble trait pour trait avec celle que l'on a peut avoir avec Xamarin. Maintenant MAUI c'est une refonte et le digne successeur de Xamarin alors espérons que les choses seront un peu plus faciles.

Tutorials and Samples for MAUI

La documentation MAUI sur le GitHub est vraiment très complète, il y a tout pour débuter :

GitHub - MAUI - Samples

(GitHub - MAUI - Samples 6.0 - Fundamentals) transféré dans 7.0 ?

GitHub - MAUI - Samples 7.0 - Tutorials - CreateNetMauiApp

...

Apprentissage

Microsoft Learn - Ressources d’apprentissage pour .NET MAUI

Il faudra très certainement regarder par Ici :

GitHub - CommunityToolkit/Maui - help make your life as a .NET MAUI developer easier

Dotnet architecture en microservice

Si vous souhaitez aller directement à un exemple whaou d'application professionnelle MAUI :

GitHub - dotnet-architecture - eshop-mobile-client: microservices

dotnet architecture MAUI en microservices

Une fois passé l'effet whaou de tout ces émulateurs, simulateurs iOS, Android, etc. et qui sont encore extrêmement lents à l'initialiser et s'exécuter du moins la première fois il faut être patient, mon objectif c'est d'avoir une première application sur mon téléphone.

Déployer sur mon Cellulaire Android

Je voudrais bien déployer mon application sur mon cellulaire... Si j'arrive à ce résultat, je serais déjà bien plus avancé qu'avec le Xamarin de l'époque.

Microsoft Learn - Configurer un appareil Android pour le débogage

Mais je sens que cela va peut être, être une galère ;) donc je configure mon téléphone HUAWEI pour le débogage via USB comme indiqué.

Passez en mode développeur

Sur le Desktop de votre téléphone (Bureau) :

Roue Crantée (Paramètres) -> Système -> A propos du téléphone -> Tapez 7 fois sur le numéro de Build.

Pour passer Développeur sur votre téléphone ... c'est comme ça !

A noter que vous devrez passer en mode développeur sur l'Emulateur Android ...

Publiez votre application

Microsoft Learn - Publier une application .NET MAUI pour Android

Il me semble qu'il va me falloir générer un APK pour Android PacKage.

fandroid - Comment installer un fichier APK sur un smartphone ou une tablette Android ?

Je tente une commande dans PowerShell :

>dotnet build -f net6.0-android

Mais toujours pas d'APK sauf en debug ?

Un lien un peu plus sérieux :

Microsoft Learn - NET MAUI - Utiliser l’interface CLI pour publier pour Android

Pour l'instant, je n'arrive pas encore à refaire la manipe mais à un moment donné, j'ai vu mon appareil HUAWEI apparaître dans la liste des devices disponibles pour une exécution de l'application MAUI de la façon suivante :

Mon Cellulaire connecté par le port USB

Je choisie mon cellulaire pour exécuter l'application, je me retrouve avec une nouvelle icône sur le desktop de mon cellulaire celle de l'application MAUI Calculator, trop fort !

Après moultes essais, il me semble qu'il me faille dans mon Cellulaire, activer d'abord la coche :

Débogage ADB en mode Charger Uniquement

J'active cette coche avant de cocher :

Débogage USB

Alors le cellulaire de demande d'autoriser le débogage USB, je clique sur Ok, à ce moment l'ordinateur sur lequel est connecté mon cellulaire par le câble USB fait le bruit de connexion d'un périphérique USB et me présente une petite boite "systray" :

Exécuter mon application MAUI sur mon Cellulaire
Exécuter mon application MAUI sur mon Cellulaire

Mon Cellulaire apparaît alors dans la liste des appareils sur lesquels je peux lancer l'exécution de mon application MAUI. A la fin de la génération et de l'exécution de l'application, j'ai une nouvelle application sur mon Cellulaire :

Déboguer une application MAUI sur Android

Je retrouve l'application installée sur le Desktop de mon Cellulaire.

Voilà, je suis parti pour créer mon application que je peux charger sur mon Cellulaire.

That's All Folks!

Blend pour Visual Studio 2022

Avec Blazor et Radzen, je trouve des outils RAD que valent-ils ? Mais je trouve cela toujours un peu ... curieux de vouloir se faire plus beau que le roi ? Qui peut aujourd'hui rivaliser en développement logiciel avec Visual Studio, du coup j'ai Blend qui me revient à l'esprit.

Mais que devient Blend ? Existe t-il toujours, Blend était un outil de design graphique d'application WPF tellement complexe que personne n'était capable de l'utiliser... Oui, ça, c'était au début de WPF et de Blend en 2010 ;-) Alors  c'est quoi Blend aujourd'hui ?

Icône Blend

Il est toujours installé avec Visual Studio et lorsque j'exécute Blend, j'ai le furieuse impression d'exécuter Visual Studio :

Blend for Visual Studio 2022
Blend for Visual Studio 2022

Heureusement qu'il y a "Blend" en haut à droite, sinon c'est la même fenêtre que Visual Studio ...

J'ouvre une application Template Blazor que puis-je faire avec Blend ? Rien du coup j'ouvre une application Template WPF. Dans le menu, il y a des tools pour les éditeurs :

Blend for Visual Studio ...

On voit bien des Tools supplémentaire autour de la page en mode design mais à part cela ... 

Du coup, je me rabats vers la documentation :

Microsoft Learn - Visite guidée de la fonctionnalité Blend pour Visual Studio

Bas c'est bien ça : Blend et ajoute des concepteurs visuels pour des tâches avancées telles que les animations et les comportements. Pour obtenir une comparaison entre Blend et Visual Studio, consultez Conception XAML dans Visual Studio et Blend pour Visual Studio.

Blend est bien l'outil indispensable si vous souhaitez réaliser des animations graphiques en XAML. 

Il va falloir que je m'y mette.













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...