Modifica della visualizzazione elenco WPF
-
20-09-2019 - |
Domanda
Per un motivo molto specifico voglio selezionare ListViewItem
s sul pulsante del mouse premuto, non effettivamente sul pulsante del mouse premuto.Voglio che questo comportamento sia incorporato nel controllo.È possibile raggiungere questo obiettivo?qualcuno può dare un suggerimento?
Soluzione
La risposta di Aviad P. è buona e utilizza in modo intelligente le proprietà associate, ma per la maggior parte del tempo tendo a utilizzare una tecnica diversa:
- Sottoclasse ListViewItem.
- Sostituisci OnMouseLeftButtonDown e OnMouseRightButton per non eseguire alcuna operazione.
- Sostituisci OnMouseLeftButtonUp / OnMouseRightButtonUp per chiamare base.OnMouseLeftButtonDown / base.OnMouseRightButtonDown.
- Visualizzazione elenco sottoclasse.
- Sostituisci GetContainerForItemOverride() per restituire l'override di ListViewItem
Questo mi sembra più semplice che iscriversi agli eventi ItemContainer e aggiungere gestori in modo dinamico.
Ecco come appare:
public class MouseUpListViewItem : ListViewItem
{
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {}
protected override void OnMouseRightButtonDown(MouseButtonEventArgs e) {}
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
}
protected override void OnMouseRightButtonUp(MouseButtonEventArgs e)
{
base.OnMouseRightButtonDown(e);
}
}
public class MouseUpListView : ListView
{
protected override DependencyObject GetContainerForItemOverride()
{
return new MouseUpListViewItem();
}
}
Mi piace questa tecnica perché è coinvolto meno codice.
Altri suggerimenti
Sì, è sicuramente possibile utilizzare proprietà associate. Definire una proprietà chiamata SelectOnMouseUp
allegato e quando è impostata su true, agganciare agli eventi ItemsContainerGenerator
per scoprire quando viene aggiunto un nuovo contenitore elemento. Poi, quando si ottiene un evento per un nuovo contenitore oggetto, agganciare nella sua PreviewMouseDown
e ignorarlo (set e.Handled
al vero), e il gancio in suo evento MouseUp
ed eseguire la selezione (set IsSelected
a true
).