J'essaie de créer une liste d'éléments avec lesquels vous pouvez effectuer plusieurs actions en cliquant avec le bouton droit de la souris et en affichant un menu contextuel. J'ai complété ça, pas de problème.
Mais j'aimerais bien que, lorsque vous cliquez avec le bouton droit de la souris sur un élément, au lieu de laisser l'élément actuel sélectionné, l'élément sur lequel se trouve la souris.
J'ai étudié cette question et d'autres questions connexes, et j'ai essayé d'utiliser indexFromPoint (que j'ai trouvé grâce à mes recherches), mais chaque fois que je clique avec le bouton droit de la souris sur un élément, il efface toujours l'élément sélectionné et n'affiche pas le menu contextuel. , tel que je l'ai défini pour qu'il n'apparaisse pas s'il n'y a pas d'élément sélectionné.
Voici le code que j'utilise actuellement:
ListBox.SelectedIndex = ListBox.IndexFromPoint(Cursor.Position.X, Cursor.Position.Y);
Manipulez ListBox.MouseDown
et sélectionnez l'élément qui s'y trouve. Comme ça:
private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
listBox1.SelectedIndex = listBox1.IndexFromPoint(e.X, e.Y);
}
Celui-ci fonctionne ...
this.ListBox.MouseUp += new System.Windows.Forms.MouseEventHandler(this.List_RightClick);
private void List_RightClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
int index = this.listBox.IndexFromPoint(e.Location);
if (index != ListBox.NoMatches)
{
listBox.Items[index];
}
}
}
Vous pouvez également obtenir le même comportement en définissant un événement MouseRightButtonUp sur toute la zone de liste, puis:
private void AccountItemsT33_OnMouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
// If have selected an item via left click, then do a right click, need to disable that initial selection
AccountItemsT33.SelectedIndex = -1;
VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), (sender as ListBox)).OfType<ListBoxItem>().First().IsSelected = true;
}