2009-03-17 4 views
3

Ich habe eine benutzerdefinierte ListBox, die ein benutzerdefiniertes Panel als ItemsHost verwendet. Ich möchte die Mausradeingabe steuern, so dass das Drehen des Rades den einzelnen ausgewählten Gegenstand ändert.WPF: Ist ListBox oder Panel für die Mausradnavigation zuständig?

Ich glaube, dass die beste Methode, dies zu tun ist, das OnPreviewMouseWheel-Ereignis zu behandeln (obwohl dies nur was ich will, da es keine horizontalen Raddaten bietet).

Jetzt die große Frage: Gibt es eine Best Practice, wo OnPreviewMouseWheel behandelt werden? In ListBox (die standardmäßig keine Ahnung über die Anordnung der untergeordneten Elemente des Panels hat) oder in Panel (das standardmäßig keine Ahnung von der "IsSelected" -Eigenschaft seiner untergeordneten Elemente hat)?

Antwort

0

Ich denke, Sie sollten dies von der ListBox tun. ListBox erbt von Selector, die alles mit der Auswahl beschäftigt.

Die Mausrad Auswahlverhalten mit jeder Art von Panel anwenden könnte (es könnte sogar eine gute Idee, ein Standard-ListBox ersten implementieren es verwendet wird), und man könnte die Panel irgendwo außerhalb einer ListBox wo die Auswahllogik verwendet werden soll würde keinen Sinn machen.

0

Es sollte von der ListBox getan werden, da nur es weiß, welches Element gerade ausgewählt ist. Das Panel möchte oder muss nicht wissen, ob es ausgewählt wurde oder nicht.

Ich würde empfehlen, dies als ein angehängtes Verhalten zu implementieren, so dass Sie die Funktionalität mehrmals verwenden können.

Um dies zu tun:
- Erstellen Sie eine neue Klasse (vielleicht ListBoxSelector genannt) mit einer angefügten Eigenschaft namens MouseWheelChangesSelection (true/false).
- Fügen Sie ein PropertyNotifyChangedEvent hinzu, und registrieren Sie beim Ändern der Eigenschaft einen Ereignis-Listener für die PreviewMouseWheel/MouseWheel-Ereignisse.

Sie können das aktuell ausgewählte Element ändern, indem Sie entweder:
- den ausgewählten Index inkrementieren; oder
- Verwendung der Bewegung der Sammlungsansichtsquelle prev/next