Ho un oggetto listview contenente i file nel programma. Il comportamento listview predefinito mi consente di eseguire tutte le operazioni di selezione nell'elenco (fai clic su + Maiusc per selezionare un blocco, fai clic su + ctrl per selezionare individualmente i membri di un gruppo di elementi e fai clic per selezionare un singolo elemento).WPF listview trascinare senza deselezionare
Voglio iniziare a trascinare questi elementi con un clic e tenere premuto il pulsante sinistro del mouse, ma deseleziona gli elementi ... e anche mentre il mouse si muove, selezionerà qualsiasi cosa il mouse sia finito. Come gestisco gli eventi del mouse per consentire normalmente la selezione predefinita, ma non selezionare/deselezionare se l'elemento viene trascinato?
Se gestisco l'evento di clic giù, la modifica della selezione avviene contemporaneamente ... è solo quando inizia il trascinamento mentre il clic è ancora inattivo che so che si tratta di un trascinamento della selezione rispetto a una selezione.
Ecco il codice XAML di base per il controllo ...
<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, così sono andato con la gestione il mouse PreviewMouseDown e visualizzare in anteprima gli eventi ... se un tasto di controllo o turno viene premuto, non imposto il flag di handle ... ma altrimenti imposto l'argomento gestito su true (quindi le modifiche alla selezione non avvengono) Quindi sull'evento previewmouseup, completo la selezione singola impostando "selected" valore su true (di nuovo solo quando si preme shift o ctrl). Quindi questo funziona ... ma la selezione del blocco maiuscole non usa alcun elemento che seleziono programmaticamente come punto di partenza valido per la selezione, invece di andare al primo elemento cliccato usando un tasto Maiusc o Ctrl (anche se io ' ha eliminato manualmente tutti gli elementi selezionati).
Qui è la fonte:
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;
}
}
}