Ich versuche, eine Liste von Elementen zu erstellen, mit denen Sie verschiedene Aktionen ausführen können, indem Sie mit der rechten Maustaste klicken und ein Kontextmenü geöffnet wird. Ich habe das erledigt, überhaupt kein Problem.
Aber ich möchte es so haben, dass, wenn Sie mit der rechten Maustaste auf ein Element klicken, anstatt das aktuelle Element ausgewählt zu lassen, das Element auszuwählen, über dem sich der Mauszeiger befindet.
Ich habe diese und andere verwandte Fragen recherchiert und versucht, indexFromPoint zu verwenden (was ich bei meiner Recherche gefunden habe), aber wenn ich mit der rechten Maustaste auf ein Element klicke, wird das ausgewählte Element immer gelöscht und das Kontextmenü nicht angezeigt , da ich es so eingestellt habe, dass es nicht angezeigt wird, wenn kein ausgewähltes Element vorhanden ist.
Hier ist der Code, den ich derzeit verwende:
ListBox.SelectedIndex = ListBox.IndexFromPoint(Cursor.Position.X, Cursor.Position.Y);
Behandeln Sie ListBox.MouseDown
und wählen Sie den Artikel dort aus. So was:
private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
listBox1.SelectedIndex = listBox1.IndexFromPoint(e.X, e.Y);
}
dieser arbeitet ...
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];
}
}
}
Dasselbe Verhalten kann auch durch Setzen eines MouseRightButtonUp-Ereignisses für das gesamte Listenfeld erzielt werden:
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;
}