2010-06-09 8 views
6

Der schwierige Teil ist, dass jedes Element eine ContextMenu hat, die ich immer noch öffnen will, wenn man mit der rechten Maustaste klickt (ich will es nur nicht auswählen).Wie kann ich verhindern, dass ListBox ein Element auswählt, wenn ich mit der rechten Maustaste darauf klicke?

In der Tat, wenn es die Dinge einfacher macht, möchte ich nicht alle automatische Auswahl überhaupt, wenn es eine Möglichkeit gibt, kann ich es vollständig deaktivieren, das wäre in Ordnung.

Ich denke eigentlich nur an eine ItemsControl wechseln, solange ich Virtualisierung und Scrollen kann, um damit zu arbeiten.

Antwort

16

Wenn Sie keine Auswahl möchten, würde ich definitiv mit ItemsControl nicht ListBox gehen. Virtualisierung und Scrollen können beide mit einem einfachen ItemsControl verwendet werden, solange sie sich in der Vorlage befinden.

Auf der anderen Seite, wenn Sie Auswahl benötigen, wollen aber einfach nicht der richtige Klick auswählen, ist der einfachste Weg, wahrscheinlich das PreviewRightMouseButtonDown Ereignis zu behandeln:

void ListBox_PreviewRightMouseButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    e.Handled = true; 
} 

Der Grund dieser Arbeiten ist, dass ListBoxItem Auswahl geschieht an der Maus nach unten, aber Kontextmenü Öffnung geschieht auf Maus bis. Das Eliminieren des Mouse-Down-Ereignisses während der Vorschauphase löst also Ihr Problem.

Dies funktioniert jedoch nicht, wenn Sie möchten, dass die Maus anderswo in Ihrer ListBox behandelt wird (z. B. in einem Steuerelement innerhalb eines Elements). In diesem Fall ist der einfachste Weg, wahrscheinlich ListBoxItem Unterklasse, es zu ignorieren:

public class ListBoxItemNoRightClickSelect : ListBoxItem 
{ 
    protected override void OnMouseRightButtonDown(MouseButtonEventArgs e) 
    { 
    } 
} 

können Sie entweder explizit diese ListBoxItems in Ihrem Itemssource konstruieren oder Sie können auch Unterklasse ListBox Ihre benutzerdefinierten Elemente verwenden, automatisch:

public class ListBoxNoRightClickSelect : ListBox 
{ 
    protected override DependencyObject GetContainerForItemOverride() 
    { 
    return new ListBoxItemNoRightClickSelect(); 
    } 
} 

FYI, hier sind einige Lösungen, die mit Erklärungen nicht arbeiten zusammen werden, warum werden sie nicht:

  • Sie können nicht nur einen Mouse Handler auf jeder ListB hinzufügen oxItem weil die registrierte Klasse Handler wird aufgerufen, bevor Ihr
  • Sie können nicht Mouse auf ListBox handhaben, da das Ereignis direkt an jede Steuerung einzeln
  • geleitet wird
+0

Dank - ich landete die Strecke gehen Itemscontrol, (umgesetzt wie hier http://stackoverflow.com/questions/2783845/wpf-virtualizing-an-itemscontrol) und es funktioniert jetzt nicht nur, wie ich möchte, auch die Leistung merklich erhöht! – devios1

Verwandte Themen