Affichage des articles dont le libellé est .NET Core. Afficher tous les articles
Affichage des articles dont le libellé est .NET Core. Afficher tous les articles

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

WPF avec .NET Core et .NET Framework

Je cherche à créer un projet WPF (Windows Presentation Foundation) et Visual Studio Community 2019. Que puis-je instancier comme applications WPF sur quel type de .NET Framework ?

Avec Visual Studio Community 2019 le choix des templates d'applications à bien changé (dans la forme ) :

Visual Studio - Template d'applications

Je peux créer une application WPF soit avec .NET Framework soit avec .NET Core. Mais je peux également créer une Application de Navigateur avec .NET Framework :

Visual Studio - Template d'application de Navigateur

Cela me fait penser aux vieilles applications XBAP en WPF pour le navigateur qui ne fonctionnaient que sur Internet Explorer, IE comme on l'appelait à l'époque.

Je vous laisse de côté le Visual Basic, ce serait bien stupide de vouloir développer aujourd'hui en Visual Basic. Sacré Bilou, il aura fallut qu'il continue de nous gonfler avec son foutu langage Visual Basic qui lui survivra ...

Si j'instancie une Application de Navigateur WPF et que je clique sur "run" :

Visual Studio - Application de Navigateur XBAP

Il s'agit bien d'un fichier XBAP qui essaye de se télécharger dans mon navigateur. Mais j'essaye d'éxécuter mon application, je trouve ce commentaire :

As far as I know, the browsers Edge doesn't support it. The XBAPs are intended to be used in intranet scenarios where all users use Internet Explorer. And many settings (such as security) are associated with IE. So, when you run it by other browser, it may have some issues.

Alors laissons cela de côté pour reprendre les Applications WPF pour le poste.

D'une part, j'ai une application WpfAppCore1 avec .NET Core :

WPF application with .NET Core
WPF Application with .NET Core

Et de l'autre, j'ai la même application mais avec comme Référence .NET framework :

WPF application with .NET Framework

Quelles autres différences entre WPF .NET Framework et WPF .NET Core :

Il y a un fichier App.config dans .NET Framework, pas dans .NET Core

Dans les csproj de .NET Core :

<TargetFramework>netcoreapp3.1</TargetFramework>
<UseWPF>
true</UseWPF>

Et dans celui de .NET Framework :

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>

Comparaison des deux instanciation d'application WPF :

Compare WPF .NET Framework vs WPF .NET Core
Différences entre WPF .NET Core et WPF .NET Framework

Ce que Microsoft nous prédit, c'est l'abandon de .NET Framework au profit de .NET Core ou .NET x.x. .NET Core est multiplateforme et open source disponible sur GitHub :

dotnet/wpf

Mais il y a pourtant encore des technologies disponibles avec .NET Framework qui ne le sont pas avec .NET Core :

  • La communication à distance identifiée comme une architecture problématique
  • Le sandboxing
  • Workflow Foundation
  • L'enregistrement des assemblys générés par réflexion
  • Les blocs de scripts XSLT

.NET Core est porté sur plusieurs plateformes .NET Framework n'est que sur Windows.

Si vous souhaitez effectuer une migration de .NET Framework vers .NET Core :

Microsoft - Migration d’applications WPF vers .NET Core

Tous ceux qui pensent encore que ce n'est pas possible de faire du WPF sur .NET Core vont devoir mettre à jour leur copie et moi le premier (mais c'était il y a longtemps). En effet .NET Core c'était ASP.NET Core (Web only).

Aujourd'hui .NET Core devient .NET 5.0 ... 6.0 .... etc

Pour tenter de comprendre les différentes version des frameworks de Microsoft vous pouvez regarder ici :

Blog .NET - Comprendre .NET Standard en 5 min

Alors en 5 minutes certainement pas, il faut bien plus de temps pour arriver en bas de cette page et franchement je n'ai pas tout compris.

Je viens d'instancier une Application WPF avec la dernière mise à jour de Visual Studio Community 2019 et dans le fichier .cproj je trouve :

<TargetFramework>net5.0-windows</TargetFramework>

Voilà, on vient de voir les trois types d'application WPF que l'on peut instancier avec Visual Studio Community 2019 et les différences qu'il y a entre .NET Framework et .NET Core.

Découvrons le projet Open Source Myrtille avec Visual Studio 2019

Il s'agit d'une application Web permettant de vous connecter aux ordinateurs à distance. Un RDP (Remote Desktop Protocol) en application Web.

Voici l'adresse du Github :

GitHub - cedrozor/myrtille

On nous dit qu'il faut Visual Studio 2017. Alors peut-on ouvrir la solution avec Visual Studio 2019 Community... ?

Je clone le répertoire sur mon disque dur grâce à GitHubDesktopSetup que je viens d'installer :

Github Clone myrtille

J'ouvre mon Visual Studio 2019 Community et j'ouvre la solution :

..\Visual Studio 2019\GithubClone\myrtille\Myrtille.sln

C'est toujours un moment délicat, soit tout va bien se passer et on va pouvoir continuer le développement, browser les sources regarder les modèles de données, soit l'ouverture du projet crash et il va falloir remédier avant d'imaginer utiliser les codes sources.

Ici, avec myrtille, l'installeur n'est pas compatible avec Community mais ça on le sait :

Installeur de myrtille incompatible avec VS Community

Pour le reste tout à l'air de se passer correctement.

Installeur de myrtille incompatible avec VS Community

Le chargement du projet myrtille me demande d'installer "Desktop development with C++".


Allons y ! C'est long, l'installation de la totalité de la chaîne et des outils de développement en C++.

Visual Studio 2019 Community se ferme automatiquement. Le processus d'installation sur ma machine actuelle prend environ 7 à 8 minutes. Visual se réouvre automatiquement avec un message "The installation has completed".

Me voilà avec un projet de développement myrtille :

Myrtille sous Visual Studio 2019 Community
Myrtille sous Visual Studio 2019 Community

Tout ceci m'a l'air très prometteur pour faire une incursion dans les technologies du projet. Si j'étais bourin, je ferais bouton droit sur la solution "Rebuild solution" mais je n'irais pas loin.

Essayons de voir ce qu'il manque en parcourant les références des différents projets. Le framework de myrtille c'est le .NET Framework 4.5. Je lance un coup de DotNetVersion sur ma machine de développement :

DoNet Version

Oups ... sur ma machine de DEV actuelle, je passe du 4.0.0.0 au 4.7.03062 ça n'est pas bon pour myrtille. La question est comment passer de .NET Framework 4.5 au .NET Framework 4.7 d'autant que je travaille actuellement sur cette machine avec .NET Core 3.0 ... 

Pour les amateurs de salmigondis :

Microsoft - Prise en charge des implémentations de .NET
En gros, il me faudrait installer une nouvelle machine (ancienne plutôt car 4.5 est un framework qui n'est plus supporté par le .NET Standard 2.1 cf. le tableau). 

Microsoft - Vue d'ensemble du Portage à partir de .NET Framework vers .NET Core
La migration de .NET Framework 4.5 vers .NET Core c'est peut être la solution mais dans ce cas; il y a du travail. Attention la dette technique augmente !

Vous avez une solution, vous êtes concerné par le projet "myrtille" n'hésitez pas à laisser votre commentaire, merci.

Error CS0656 Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

Blurps, blurps, j'ai un peu de mal à digérer cette erreur, on s'accroche et on trouve la solution ... Voici le contexte : une application ASP.NET Core C# mais je penses qu'il suffit d'utiliser le mot clef "dynamic" pour avoir des soucis et obtenir cette erreur du compilateur au moment de la génération de l'application.

Il y a une partie de réponse succincte ici :

Add the reference to Microsoft.CSharp as
Project->add reference-->Framework-->Microsoft.CSharp

Visual Studio - How to fix missing compiler member error Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create

Mais cette réponse est trop rapide, en effet on ne trouve rien dans l'onglet correspondant, il faut aller chercher la référence à cette DLL directement dans le Framwork "à la main" de la façon suivante :

C:\Windows\Microsoft.NET\Framework64\v4.0.30319
C:\Windows\Microsoft.NET\Framework64\v4.0.30319

Et toujours cette fonction de recherche de fichiers sous Windows 10 qui n'est vraiment pas satisfaisante mais bon, passons. On fini par trouver le path de la DLL, dont on va pouvoir ajouter la référence dans le projet. Voici le chemin d'accès (path) vers cette DLL Microsoft.CSharp.dll :

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.CSharp.dll

Mais n'est-ce pas un peu aberrant cette façon de faire, en tous cas elle est dépendante de la machine, alors il y en a un qui préconise l'installation de NuGet, de la façon suivante :

They have in common that one may add NuGet package Microsoft.CSharp:
"... install the Microsoft.CSharp package in the .NET Standard project. This library is necessary to use the C# dynamic data type in a .NET Standard library. ..."


Personnellement, j'ai installé le NuGet package Microsoft.CSharp :

.NET Core Utilisation de Dynamic -> Installation du package Microsoft.CSharp
.NET Core Utilisation de Dynamic -> Installation du package Microsoft.CSharp

Et cela à fonctionné pour moi, mais elle est un peu ... heu, comment dire, violente cette erreur simplement sur l'utilisation du mot clef dynamic le message de l'erreur est incompréhensible. J'espère que cela sera corrigé dans les prochaines release des frameworks de Visual Studio.

CQFD !

C'est quoi .NET Core ?

C'est la bonne question, je fais du .NET depuis toujours sans le savoir et pourtant aujourd'hui je veux savoir exactement ce qu'est .NET Core. .NET Core 1.0 a été releasé le 27 juin 2016 cela fait donc un bail mais comme pour toutes les technos Microsoft, il faut attendre que ceux qui ont du temps payent les pots cassés sinon vous allez devoir les recoller vous-même.

https://github.com/dotnet
https://github.com/dotnet

Bref, c'est derniers temps, j'ai été occupé avec ASP.NET aspx ASP.NET MVC avec JQuery  ASP.NET avec Angular, rattrapons le retard.

Définition : .Net Core c'est une réécriture du .NET Framework en composants modulaires distribués via Nuget, embarqués dans votre application. Je pourrais ajouter Cross-Plateformes et Open Source.

.NET Core comporte deux parties :

  • CoreFx : l’implémentation de .Net Core sous la forme d'assemblies (DLL)
  • CoreCLR : le moteur d’exécution de .Net Core (garbage collector, compilateur JIT, types de base .Net)

Pour le reste absolument toute la documentation est sur GitHub, je vous laisse avec la .NET Core Roadmap

Et le GitHub .NET Core Home

Est ce que cela à t-il encore à voir avec Microsoft ? C'est ma question cela a-t-il un grand avenir c'est aussi la question à 100 millions d'euros.