[WPF] Ajouter une image comme ressource intégrée à l’exécutable

Cette méthode permet d’éviter l’oubli du ou des fichiers des images/icônes utilisés dans le répertoire de l’application lors de son déploiement.

La procédure à suivre est la suivante :

1. Ajouter l’image à la solution via un clic droit soit sur le projet, soit sur un dossier appartenant à celui-ci et destiné à contenir les différentes images.

Sélectionner Ajouter > Élément existant. A partir de la boite de dialogue qui s’ouvre, sélectionner l’image à ajouter.

2. Dans les propriétés de l’image ajoutée, vérifier que l’option « Action de génération » est bien « Resource ».

3. Dans le code XAML de la fenêtre qui doit utiliser cette image, ajouter celle-ci dans les ressources en utilisant le code suivant :

où
Key : est la clé de l’image. La ressource sera utilisable via cette clé.
UriSource : est le chemin du fichier image.

4. Utiliser l’image dans un contrôle Image ou comme icône dans un bouton par exemple. Le code suivant illustrant la méthode à utiliser pour y parvenir :

[Windows 8] Désactiver le cache des imagettes dans Windows 8

Celui-ci est caractérisé par la présence du fichier Thumbs.db dans des dossiers réseaux. Ce type de fichier permet la mise en cache des miniatures des éléments situés dans ces dossiers.

Pour désactiver ce cache :

1. Ouvrir la fenêtre d’exécution de Windows (Touche Windows + r).
2. Exécuter la commande gpedit.msc
3. Naviguer jusqu’au paramètre de stratégie Désactiver la mise en cache des miniatures dans les fichiers masqués thumbs.db (Catégorie Configuration utilisateur -> Modèles d’administration -> Composants Windows -> Explorateur de fichiers).

Gestion des paramètres de statégies de groupe locales

[OleDb – Excel] Problème pour récupérer la première ligne d’une feuille Excel

Pour pouvoir récupérer les données dans une feuille Excel en utilisant une connexion OleDb, il est nécessaire pour pouvoir récupérer les valeurs dans la première ligne de la feuille d’utiliser la propriété HDR dans la connectString

HDR=Yes : La première ligne de la feuille sera ignorée (utile dans le cas ou cette ligne reprend les entêtes de colonnes)
HDR=No : La première ligne de la feuille sera interprétée comme valeurs et donc renvoyée lors d’un select * from [Feuil1$] par exemple

Exemple :

Connection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;" + "data source=E:\test.xls;Extended Properties=""Excel 8.0;HDR=No""")

[VB.Net] [WinForm] Arrière plan en dégradé dans une form

Objectif

Obtenir un dégradé comme arrière plan pour une fenêtre.

Méthode

Il suffit de modifier la fonction de l’événement OnPaint de la fenêtre concernée.

Par exemple pour obtenir un dégradé horizontal :

Imports System.Drawing.Drawing2D
...
Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
  Dim formGraphics As Graphics = e.Graphics
 
  Dim gradientBrush As New LinearGradientBrush(New Point(0, 0), New Point(Width, 0), Color.White, Color.DarkMagenta)
 
  formGraphics.FillRectangle(gradientBrush, ClientRectangle)
End Sub

Supprimer un lecteur réseau

Objectif

Supprimer un lecteur réseau sous Windows de l’explorateur de fichier. En effet même en utilisant utilisant le point de menu « Déconnecter », cela ne supprime pas toujours le lecteur de l’arborescence.

Méthode

Dans ce cas on peut utiliser 2 autres solutions :

La commande net use « \\Chemin du mapping » /delete /YES qui supprime le lecteur réseau.

Si cela n’est pas suffisant, allez dans l’éditeur de la base de registre (regedit en ligne de commande)

Dans HKEY_Current_User\Software\Microsoft\Windows\CurrentVersion\Explorer\Map Network Drive MRU :
РSupprimez la cl̩ correspondant au lecteur que vous voulez supprimer.
– Éditez la clé MRUListe en supprimant la lettre correspondant au lecteur supprimé.

Dans tous les cas, redémarrer la machine.

Passage de paramètre(s) entre deux Form

La question revient souvent sur le forum donc j’ai écris ce petit article concernant le passage de paramètre entre deux Form. Pour l’exemple j’ai utilisé le VB mais c’est facilement transposable en C#.

Prenons donc le cas d’une Form1 qui appelle une Form2(via un bouton). Form2 doit pouvoir modifier une variable définie dans Form1.

Première méthode : On passe une référence de la Form1 via le constructeur de la Form2

Le code de Form1:

Public Class Form1
    ' La variable concernée doit être déclarée Public.
    Public variable As Integer
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        variable = 1
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' Lors de l'instanciation de Form2, on passe la référence sur la Form1
        Dim dial As New Form2(Me)
 
        dial.ShowDialog()
 
        MessageBox.Show(variable.ToString())
    End Sub
End Class

Le code de Form2:

Public Class Form2
    ' L'objet Form1
    Private frm As Form1
 
    Public Sub New()
        ' Cet appel est requis par le concepteur.
        InitializeComponent()
 
        ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
    End Sub
 
    ' Le constructeur permettant le passage de la référence sur la Form1
    Public Sub New(ByRef pfrm As Form1)
        InitializeComponent()
 
        frm = pfrm
 
 
        frm.variable = 2
    End Sub
End Class

L’avantage de cette méthode est qu’on peut avoir accès à d’autres variables ou méthodes de Form1 pour autant qu’elles soient définies comme étant Public. Par contre, il sera impossible d’appeler Form2 à partir d’une autre fenêtre.

Deuxième méthode : On passe via une propriété de Form2

Code de Form1:

Public Class Form1
    Private locVariable As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        locVariable = 1
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim dial As New Form2()

        dial.Variable = locVariable

        dial.ShowDialog()

        MessageBox.Show(locVariable.ToString())
    End Sub
End Class

Code de Form2:

Public Class Form2
    Private frm As Form1

    Private locVariable As Integer

    Public Property Variable() As Integer
        Get
            Return locVariable
        End Get
        Set(ByVal value As Integer)
            locVariable = value
        End Set
    End Property

    Public Sub New()
        ' Cet appel est requis par le concepteur.
        InitializeComponent()
    End Sub
End Class

Troisième méthode : On passe la variable via le constructeur de Form2

Le code de Form1:

Public Class Form1
    Private locVariable As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        locVariable = 1
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim dial As New Form2(locVariable)

        dial.ShowDialog()

        MessageBox.Show(locVariable.ToString())
    End Sub
End Class

Le code de Form2:

Public Class Form2
    Private frm As Form1

    Private locVariable As Integer

    Public Sub New()
        ' Cet appel est requis par le concepteur.
        InitializeComponent()

        locVariable = 0
    End Sub

    Public Sub New(ByRef pVariable As Integer)
        ' Cet appel est requis par le concepteur.
        InitializeComponent()

        locVariable = pVariable
    End Sub
End Class

L’avantage des deux dernières méthodes étant que Form2 peut-être appelée d’une autre fenêtre.

WPF – La correction orthographique en bref

Les composants de saisie de texte (TextBox et RichTextBox) possèdent la propriété SpellCheck qui permet d’activer la correction orthographique.
Si cette propriété est activée (donc que sa valeur vaut true), les éventuelles erreurs détectées dans le texte contenu dans ces composants seront soulignées comme dans un éditeur tel que Microsoft Word. D’ailleurs le dictionnaire utilisé pour les propositions de correction est une copie de celui de cet éditeur. Il n’est toutefois pas obligatoire que Microsoft Word soit installé sur la machine pour pouvoir utiliser cette fonctionnalité. Le code suivant va permettre d’activer cette fonctionnalité pour la langue française dans la déclaration XAML d’un TextBox :

SpellCheck.IsEnabled="True" Language "fr-FR"

Ce qui donnera comme résultat dans une petite application d’exemple :

WPF - Traduction orthographique - 1

Voici donc encore un des nombreux avantages du WPF maintenant qu’il est de plus en plus important d’avoir des applications multilingues.

[C#] Lister les périphériques de stockage USB en utilisant WMI

Il arrive que l’on doive détecter les disques dur connectés à l’ordinateur par USB.

Il existe certes la classe DriveInfo de l’espace de nom System.IO. Mais après différents tests, j’ai constaté que lorsqu’on l’utilisait pour obtenir les informations concernant un disque dur externe connecté en USB, la propriété DriveType de cette classe renvoyait la valeur Fixed alors qu’on aurait pu s’attendre à la valeur Removable. Donc en utilisant cette classe, un disque dur externe USB est reconnu comme s’il s’agissait d’un disque interne de la machine.

Il existe toutefois une solution en utilisant WMI (Windows Management Instrumentation). Il permet entre autre d’accéder aux ressources d’un ordinateur et d’en obtenir les informations.

Voici donc un exemple de code permettant de récupérer la liste des lecteurs logiques se trouvant sur des disques dur connectés via USB :

foreach (ManagementObject drive in new ManagementObjectSearcher("select * from Win32_DiskDrive where InterfaceType='USB'").Get())
{
    foreach (ManagementObject partition in new ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + drive["DeviceID"] + "'} WHERE AssocClass =Win32_DiskDriveToDiskPartition").Get())
    {
       foreach (ManagementObject disk in new ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + partition["DeviceID"] + "'} WHERE AssocClass =Win32_LogicalDiskToPartition").Get())
        {
            Console.WriteLine(disk["Name"]);
        }
    }
}

L’espace de nom à inclure étant System.Management