J'ai un objet listview contenant des fichiers dans le programme. Le comportement listview par défaut me permet de faire toutes les opérations de sélection de la liste (cliquez + Maj pour sélectionner un bloc, cliquez sur + ctrl pour sélectionner individuellement les membres d'un groupe d'éléments, et cliquez pour sélectionner un seul élément). Je veux commencer à faire glisser ces éléments avec un clic du bouton gauche de la souris, mais il désélectionne les éléments ... et même lorsque la souris se déplace, elle sélectionne la souris. Comment gérer les événements de la souris pour permettre la sélection par défaut normalement, mais pas sélectionner/désélectionner si l'élément est déplacé? Si je gère l'événement de clic vers le bas, le changement de sélection se produit en même temps ... c'est seulement quand un drag commence alors que le clic est encore bas que je sais qu'il s'agit d'un glisser-déposer contre un changement de sélection.WPF listview glisser sans désélection
Voici le XAML de base pour le contrôle ...
<Window.Resources>
<Style x:Key="itemstyle" TargetType="{x:Type ListViewItem}">
<EventSetter Event="PreviewMouseDown" Handler='listView2_MouseLeftButtonDown'/>
</Style>
</Window.Resources>
<ListView Grid.Column="0" Grid.Row="1" Name="listView2" Margin="5,5,5,5" BorderBrush="LightGray" AllowDrop="True" Drop="listView2_Drop" ItemsSource="{Binding}" ItemContainerStyle="{StaticResource itemstyle}">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" Width="100">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Bmp}"/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Ext" DisplayMemberBinding="{Binding Ext}" Width="Auto"/>
<GridViewColumn Header="Size" DisplayMemberBinding="{Binding Size}" Width="Auto"/>
<GridViewColumn Header="Date" DisplayMemberBinding="{Binding Date}" Width="Auto"/>
</GridView>
</ListView.View>
</ListView>
Ok, donc je suis allé avec les événements de la manipulation de la souris et PreviewMouseDown aperçu jusqu'à ... si une touche de commande ou changement la touche est enfoncée, je ne mets pas le drapeau handle ... mais sinon je mets l'argument managé à true (donc les changements de sélection ne se produisent pas) Puis sur l'évènement previewmouseup, je complète la sélection en sélectionnant le "selected" valeur à true (à nouveau uniquement lorsque shift ou Ctrl est enfoncé). Donc, cela fonctionne un peu ... mais le shift-block-selection n'utilise aucun élément que je sélectionne par programme comme point de départ valide pour le select, mais je vais plutôt le premier élément cliqué avec une touche shift ou ctrl (même si J'ai effacé tous les éléments sélectionnés manuellement).
Voici la source:
private void listView2_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
if (!Keyboard.IsKeyDown(Key.LeftCtrl) &&
!Keyboard.IsKeyDown(Key.RightCtrl) &&
!Keyboard.IsKeyDown(Key.LeftShift) &&
!Keyboard.IsKeyDown(Key.RightShift))
{
e.Handled = true;
}
}
}
private void listView2_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left)
{
if (!Keyboard.IsKeyDown(Key.LeftCtrl) &&
!Keyboard.IsKeyDown(Key.RightCtrl) &&
!Keyboard.IsKeyDown(Key.LeftShift) &&
!Keyboard.IsKeyDown(Key.RightShift))
{
listView2.SelectedItems.Clear();
ListViewItem lvi = sender as ListViewItem;
listView2.SelectedItem = lvi;
lvi.IsSelected = true;
e.Handled = true;
}
}
}