Domanda

Per un motivo molto specifico voglio selezionare ListViewItems 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?

È stato utile?

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:

  1. Sottoclasse ListViewItem.
  2. Sostituisci OnMouseLeftButtonDown e OnMouseRightButton per non eseguire alcuna operazione.
  3. Sostituisci OnMouseLeftButtonUp / OnMouseRightButtonUp per chiamare base.OnMouseLeftButtonDown / base.OnMouseRightButtonDown.
  4. Visualizzazione elenco sottoclasse.
  5. 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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top