modificação WPF Listview
-
20-09-2019 - |
Pergunta
Por uma razão muito específica eu quero selecionar ListViewItem
s no botão do mouse para cima, não realmente no botão do mouse pressionado. Eu quero esse comportamento para ser incorporado no controle. É possível conseguir isso? Alguém pode dar dica?
Solução
A resposta de Aviad P. é um bom e um uso inteligente das propriedades anexadas, mas eu tendem a usar uma técnica diferente na maioria das vezes:
- subclasse ListViewItem.
- Substituir OnMouseLeftButtonDown e OnMouseRightButton para não fazer nada.
- Substituir OnMouseLeftButtonUp / OnMouseRightButtonUp chamar base.OnMouseLeftButtonDown / base.OnMouseRightButtonDown.
- subclasse ListView.
- Substituir GetContainerForItemOverride () para retornar o ListViewItem override
Isso parece mais fácil para mim do que a subscrição de eventos ItemContainer e adicionando manipuladores de forma dinâmica.
Este é o que parece:
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();
}
}
Eu como esta técnica, porque há menos código envolvido.
Outras dicas
Sim, é definitivamente possível usando propriedades anexadas. Definir uma propriedade chamada SelectOnMouseUp
anexo e quando é definido como verdadeiro, gancho para seus eventos ItemsContainerGenerator
para descobrir quando um novo recipiente item é adicionado. Então, quando você recebe um evento para um novo recipiente de item, gancho em seu PreviewMouseDown
e ignorá-lo (conjunto e.Handled
como true), e gancho para o evento MouseUp
e realizar a seleção (set IsSelected
para true
).