La version 0.4 de la librairie Dvp.NET est disponible !



La version précédente était déjà riche en nouvelles fonctionnalités, celle-ci l'est encore plus ! Vous trouverez ci-dessous la liste des changements apportés par cette version.

Encore une fois, il y a quelques "breaking changes" (et oui, ça reste une beta pour l'instant...), qui sont indiqués en rouge. A noter : l'assembly Developpez.Dotnet.Web a été purement et simplement supprimé : son maigre contenu (une classe avec une méthode pas très utile) ne justifiait pas qu'on le conserve. Il sera réintroduit plus tard si on a des choses utiles à mettre dedans.

  • Assembly Developpez.Dotnet
    • Classe CoreExtensions (méthodes d’extension multi-usage)
      • Méthode ToHexString : convertit un tableau d’octets en sa représentation hexadécimale
      • Méthode ToBase64String : convertit un tableau d’octets en sa représentation en base 64
      • Méthode CheckArgumentInEnum : vérifie si l’argument spécifié est une valeur d’enum valide, et lève une ArgumentOutOfRangeException si ce n'est pas le cas
        Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        public void DoSomething(MyEnum x)
        {
            x.CheckArgumentInEnum("x");
            ...
        }


    • Classe DataExtensions : méthodes d’extension pour l’accès aux données avec ADO.NET
      • Méthode CreateConnection : raccourci pour créer une connexion à partir d’un DbProviderFactory en spécifiant la chaine de connexion
      • Méthode ToDataTable : convertit une collection d’objets en DataTable
      • Méthode Sort : trie une DataTable selon la colonne spécifiée
      • Méthode GetData : obtient un DataReader imbriqué pour la colonne spécifiée (équivalent à IDataRecord.GetData, mais accepte le nom de la colonne plutôt que sa position)
      • Méthode Select : exécute une commande et effectue une projection du résultat en une séquence d’objets. Peut être utilisé directement avec la syntaxe de requête Linq :
        Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        using (var command = connection.CreateCommand("SELECT * FROM Person"))
        {
            var results =
                from record in command
                select new
                {
                    Id = record.GetGuid("Id"),
                    LastName = record.GetString("LastName"),
                    DateOfBirth = record.Field<DateTime?>("DateOfBirth"),
                    LuckyNumber = record.Field<int?>("LuckyNumber")
                };
         
            foreach(var person in results) ...
         
        }
      • Méthode SaveAsCsv : enregistre une DataTable dans un fichier ou un flux au format CSV
      • Méthode ToCsv : renvoie une chaine contenant la représentation CSV d’une DataTable
      • Modifié certaines méthodes pour étendre les interfaces (IDbConnection, IDbCommand, etc) plutôt que les classes abstraites (DbConnection, DbCommand, etc)


    • Classe EnumerableExtensions (méthodes d’extension pour Linq to Objects et les collections)
      • Méthode GetElementType : obtient le type des éléments d’une séquence (utile lorsqu’on travaille avec des types anonymes)
      • Méthode CommonPrefix : obtient le plus long préfixe commun de deux séquences
      • Méthode Max : comme Enumerable.Max, mais permet de spécifier un IComparer
      • Méthode ExceptBy : comme Enumerable.Except, mais permet de spécifier la clé de comparaison des éléments
      • Méthode IntersectBy : comme Enumerable.Intersect, mais permet de spécifier la clé de comparaison des éléments
      • Renommé Distinct en DistinctBy, par souci de cohérence
      • Renommé WithMin/WithMax en MinBy/MaxBy, par souci de cohérence
      • Les méthodes suivantes ont été déplacées vers ArrayExtensions :
        • GetSegment
        • AsEnumerable(ArraySegment)
        • ToArray(ArraySegment)
        • ShiftRight/ShiftLeft
        • RotateRight/RotateLeft

        (breaking change au niveau binaire, mais pas au niveau source, dans la mesure où ce sont des méthodes d'extensions et où elles restent dans le même namespace)


    • Classe CompareExtensions (méthodes d'extensions pour les comparaisons et comparateurs)
      • Amélioration de la méthode Reverse (performance + bug potentiel)


    • Classe XmlExtensions (méthodes d’extension pour faciliter l’écriture de requêtes Linq to XML)
      • Méthode SafeValue : renvoie la valeur d'un élément (ou attribut) XML s'il n'est pas null, ou null si l'élément (ou attribut) est null.
      • Méthode SafeElement : renvoie le premier élément enfant du conteneur avec le nom spécifié, ou null si le conteneur est null.
      • Méthode SafeElements : renvoie une collection des éléments enfants d’un conteneur, ou une séquence vide si le conteneur est null.
      • Méthode SafeAttribute : renvoie l'attribut avec le nom spécifié, ou null si l'élement est null.
      • Méthode SafeAttributes : renvoie une collection des attributs de cet élément, ou une séquence vide si l'élément est null.


    • Classe ReflectionExtensions (méthodes d’extension pour l’utilisation de la réflexion)
      • Méthodes IsConvertibleFrom/To, IsImplicitlyConvertibleFrom/To : indique s’il existe une conversion entre deux types


    • Classe StreamExtensions (méthodes d’extensions pour la manipulation de flux binaires)
      • Méthode ReadAllBytes : lit tout le contenu du flux et le renvoie sous forme de tableau d’octets
      • Méthode ReadBytes : lit le nombre d’octets spécifié à partir du flux et les renvoie sous forme de tableau d’octets (bloque jusqu’à ce que le nombre d’octets demandé ait été lu, ou que la fin du flux soit atteinte, contrairement à Stream.Read)
      • Renommé CopyToStream en CopyTo pour être cohérent avec la méthode qui existe dans .NET 4
      • Nouvelles surcharges de CopyTo/CopyToFile pour spécifier la taille du buffer


    • Classe DateExtensions (méthodes d’extensions pour la manipulation de dates)
      • Méthode IsWorkingDay : indique si une date est un jour ouvré (ne tient pas compte des vacances et jours fériés)
      • Méthode AddWorkingDays : ajoute le nombre spécifié de jours ouvrés à une date (ne tient pas compte des vacances et jours fériés)


    • Classe StringExtensions (méthodes d’extension pour la manipulation de chaines de caractères)
      • Méthode EqualsWithNullAsEmpty : indique si deux chaines sont égales, en considérant les chaines nulles et vides comme égales
      • Méthode GetSHA1Digest : renvoie le hash SHA1 de la chaîne sous forme d'une chaîne hexadécimale
      • Méthode Contains : surcharge qui permet de spécifier le type de comparaison (traitement des majuscules/minuscules)


    • Classe ArrayExtensions (méthodes d’extension pour la manipulation de tableaux)
      • Méthode GetRows : transforme un tableau à 2 dimensions en une séquence de tableaux à une dimension
      • Méthode ToJaggedArray : transforme un tableau à 2 dimensions en tableau en escalier (tableau de tableaux)
      • Méthode ToBidimensionalArray : transforme un tableau en escalier (tableau de tableaux) en tableau à 2 dimensions
      • Méthodes déplacées depuis EnumerableExtensions :
        • GetSegment (déplacé depuis EnumerableExtensions)
        • AsEnumerable(ArraySegment)
        • ToArray(ArraySegment)
        • ShiftRight/ShiftLeft
        • RotateRight/RotateLeft


    • Classe NumberConverter (conversion de nombres en toutes lettres)
      • Modification de SpellAmount pour permettre un contrôle plus fin de la devise. Les devises les plus courantes (euro, dollar, livre) sont prédéfinies
      • Améliorations pour permettre le support de plusieurs langues (pour l’instant seul le français est implémenté, l’anglais est prévu…)


    • Conversions d’unités de mesure :
      • Longueur : mètre, pied, pouce, mile, mille marin
      • Surface : mètre carré, pied carré, pouce carré, acre, are, hectare
      • Volume : mètre cube, litre, pinte, gallon, gallon US, once liquide, once liquide US
      • Masse : kilogramme, livre, once
      • Température : Kelvin, Celsius, Fahrenheit
      • Angle : radian, degré, grade
        Exemple :
        Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        Celsius temp = 25;
        Fahrenheit tempF = temp.ToFahrenheit();
        Console.WriteLine ("La température est de {0:G2}", temp);
        Console.WriteLine ("The temperature is {0:G2}", tempF);
        // Affiche :
        // La température est de 25 °C
        // The temperature is 77 °F


    • Classe VirtualizingCollection<T> : collection abstraite qui implémente la virtualisation de données. Utile pour afficher une grande quantité de données dans une interface graphique sans tout charger en mémoire.

    • Classe QueueSet<T> : implémente une file où chaque élément ne peut être présent qu’une fois. Si un élément ajouté est déjà présent, il est replacé en bout de file

    • Classe StackSet<T> : implémente une pile où chaque élément ne peut être présent qu’une fois. Si un élément ajouté est déjà présent, il est replacé sur le dessus de la pile

    • Classe ByteSizeFormatter : formate une taille en octets de façon lisible pour l'utilisateur. De nombreuses options sont disponibles pour personnaliser le formatage (unité minimum/maximum, préfixes binaires ou décimaux, usage traditionnel ou conforme aux standards, format numérique...)


  • Assembly Developpez.Dotnet.Drawing (GDI)
    • Classe BitmapExtensions (méthodes d’extension pour la manipulation d’images bitmap GDI)
      • Méthode Crop : rogne l'image d'origine en ne conservant que la zone spécifiée, et renvoie la nouvelle image


  • Assembly Developpez.Dotnet.Windows (WPF)
    • Classe DispatcherExtensions : méthodes d’extension pour le Dispatcher
      • Méthode InvokeIfRequired : exécute une action sur le thread du Dispatcher, en utilisant Invoke si nécessaire.


    • Classe FrameworkElementExtensions : méthodes d’extension pour les FrameworkElements
      • Méthode DoWhenLoaded : exécute une action sur l’élément quand il est chargé, ou immédiatement s’il est déjà chargé


    • Classe ImageBehavior : comportements pour les contrôles Image


    • Classe TextBoxBehavior : comportements pour les contrôles TextBox
      • Propriété attachée SelectAllOnFocus : sélectionne automatiquement tout le texte quand la TextBox prend le focus
      • Propriété attachée NumericOnly : indique que la TextBox n’accepte que des nombres. On peut autoriser ou non les nombres décimaux
        Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        <TextBox Text="{Binding Age}"
                 dvp:TextBoxBehavior.NumericOnly="True"
                 dvp:TextBoxBehavior.AllowDecimal="False" />


    • Classe TreeViewBehavior : comportements pour les contrôles TreeView
      • Propriété attachée SelectedItem (+ propriétés associées) : permet de binder l’élément sélectionné d’un TreeView, pour l'utilisation du TreeView en MVVM

        Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        <TreeView ItemsSource="{Binding Nodes}"
                  dvp:TreeViewBehavior.TrackSelectedItem="True"
                  dvp:TreeViewBehavior.SelectedItem="{Binding SelectedNode}"
                  dvp:TreeViewBehavior.IsSelectedPath="IsNodeSelected">
            <TreeView.ItemContainerStyle>
                <Style TargetType="TreeViewItem">
                    <Setter Property="IsSelected" Value="{Binding IsNodeSelected}" />
                </Style>
            </TreeView.ItemContainerStyle>
              ...


    • Classe FocusBehavior : comportements pour contrôler le focus
      • Propriété attachée FocusOnLoad : indique qu’un élément prend le focus dès qu’il est chargé


    • Classe AutoCompleteBehavior : comportements pour activer l’autocomplétion sur des TextBox
      • Propriété attachée ItemsSource : indique la source des éléments de l’autocomplétion
      • + autres propriétés pour personnaliser le comportement et l'apparence
        Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        <TextBox Width="120" VerticalAlignment="Center"
                 dvp:AutoCompleteBehavior.ItemsSource="{Binding Countries}"
                 dvp:AutoCompleteBehavior.SearchMemberPath="EnglishName"
                 dvp:AutoCompleteBehavior.ComparisonType="InvariantIgnoreCase"
                 dvp:AutoCompleteBehavior.MatchMode="StartsWith"
                 dvp:AutoCompleteBehavior.Suggest="True">
            <dvp:AutoCompleteBehavior.ItemTemplate>
                <DataTemplate>
                    <TextBlock>
                        <TextBlock.Text>
                            <MultiBinding StringFormat="{}{0} ({1})">
                                <Binding Path="DisplayName" />
                                <Binding Path="EnglishName" />
                            </MultiBinding>
                        </TextBlock.Text>
                    </TextBlock>
                </DataTemplate>
            </dvp:AutoCompleteBehavior.ItemTemplate>
        </TextBox>


    • Classe BindingProxy : classe permettant le binding dans des situations où le DataContext n’est pas directement accessible. Voir cet article pour plus de détails

    • Classe MouseWheelGesture : définit un mouvement de la molette de la souris, pour l’utilisation dans un InputBinding. Cela permet de pallier un manque de MouseGesture, qui permet déjà de gérer un mouvement de la molette, mais sans préciser lequel...

    • Contrôle IPAddressBox : contrôle permettant l’édition d’une adresse IPv4

      Le binding est évidemment supporté, et un évènement routé AddressChanged est disponible

    • Contrôle RatingControl : contrôle permettant de saisir visuellement une note entre 1 et 5.
      • Il est possible de personnaliser les images à utiliser :
        • Avec les images par défaut :
        • Avec des images personnalisées :
      • 3 modes de notation sont supportés :
        • Integer : note arrondie à l'entier
        • HalfPoint : note arrondie au demi-point
        • Decimal : note non arrondie
      • Bien sûr, la valeur peut être liée par un binding, et un évènement ValueChanged est disponible pour signaler les modifications


  • Assembly Developpez.Dotnet.Web (ASP.NET) : supprimé


J'espère que toutes ces nouveautés vous seront utiles ! N'hésitez pas à nous suggérer des nouveautés et à signaler les bugs sur le gestionnaire de projet