Je fais une interface graphique Powershell, je veux utiliser une info-bulle sur une listbox, mais je ne suis pas familier avec les événements et les gestionnaires d'événements, je ne trouve pas d'aide pour les événements powershell / winform sur Microsoft.com
Sous ma listbox se trouve $ listbox_groupe_import

#Infobulle au survol pour voir les tables d'un groupe de table
$obj_infobulle = New-Object System.Windows.Forms.ToolTip 
$obj_infobulle.InitialDelay = 100     
$obj_infobulle.ReshowDelay = 100 

#Sélectionne tous les groupes de tables dans la base de données et les met dans une liste déroulante 
$listbox_groupe_import = Get-ListboxGroup
#Création d'une info bulle pour la Listbox.
$obj_infobulle.SetToolTip($listBox_groupe_import, "tooltip sur listbox")

Je souhaite définir l'info-bulle au survol de la souris
J'ai trouvé ceci mais je ne sais pas comment l'exécuter:

$listboxGroupe_MouseMove = [System.Windows.Forms.MouseEventHandler]{
    #Event Argument: $_ = [System.Windows.Forms.MouseEventArgs]
    #TODO: Place custom script here

    #index vaut ce qu'on pointe avec la souris au dessus de listbox1
    $index = $listBox_groupe.IndexFromPoint($_.Location)     #$_ => this (listbox.location) je crois
    ##"index ="+$index
    ##$tooltip1.SetToolTip($listBox_groupe, "index ="+$index)

    if ($index -ne -1){ 
        #Tooltype sur listbox1 = valeur de l'item pointé
        $tooltip1.SetToolTip($listBox_groupe, $listBox_groupe.Items[$index].ToString()) 
    }
    else{ 
        #on n'est pas au dessus de listBox_groupe
        $tooltip1.SetToolTip($listBox_groupe, "") 
    }
}

Pouvez-vous me dire comment exécuter ce code en passant la souris sur ma listbox?
Ou une autre façon d'afficher une info-bulle avec un texte différent pour chaque élément de ma liste?
Je vous remercie

2
Kishiro 23 mai 2018 à 15:07

3 réponses

Meilleure réponse

Pouvez-vous me dire comment exécuter ce code en passant la souris sur ma listbox?

Pour trouver l'emplacement de la souris dans l'événement de survol, vous pouvez d'abord utiliser Control.MousePosition pour trouver l'emplacement de l'écran de la souris, puis en utilisant ListBox.PointToClient, le convertir en position de la souris sur le contrôle. Ensuite, le reste de la logique est similaire à ce que vous avez déjà:

$point = $listBox.PointToClient([System.Windows.Forms.Control]::MousePosition)
$index = $listBox.IndexFromPoint($point)
if($index -ge 0) {
    $toolTip.SetToolTip($listBox, $listBox.GetItemText($listBox.Items[$index]))
}
else {
    $toolTip.SetToolTip($listBox, "")
}

Juste pour l'améliorer, j'ai utilisé la méthode ListBox.GetItemText qui est meilleure que la méthode des éléments ToString. Si vous définissez un objet complexe comme source de données de la zone de liste et définissez la propriété de membre d'affichage, il extrait le texte de l'élément en fonction du nom d'affichage, sinon il renvoie ToString de l'élément.

N'oubliez pas non plus que pour gérer l'événement MouseHover, vous devez utiliser Add_MouseHover.

1
Reza Aghaei 23 mai 2018 à 14:36

Solution :

#Au survol
$listBox_groupe.add_MouseEnter({

    #récupérer la position de la souris
    $point = $listBox_groupe.PointToClient([System.Windows.Forms.Control]::MousePosition)

    #récupérer l'indice de l'item sur lequel on pointe
    $index = $listBox_groupe.IndexFromPoint($point)

    if($index -ge 0) {
        #l'infobulle est au dessus de listBox_groupe et elle a pour texte le texte de l'item
        $tooltip1.SetToolTip($listBox_groupe, $listBox_groupe.GetItemText($listBox_groupe.Items[$index]))
    }
})
0
Kishiro 24 mai 2018 à 07:30

Voici la documentation. En particulier, regardez les événements en bas. Il y a un événement MouseHover que vous voudrez ajouter:

$MyListBox.add_MouseHover({
    # display your tooltip here
})
$MyListBox.add_MouseLeave({
    # remove the tooltip now that user moved away
})

Les interfaces graphiques et les gestionnaires d'événements PowerShell ne sont pas très bien documentés car vous souhaitez généralement gérer ce genre de choses en C #.

0
Maximilian Burszley 23 mai 2018 à 12:28