プログラム内にファイルを含むリストビュー オブジェクトがあります。デフォルトのリストビューの動作では、リストですべての選択操作を実行できます (ブロックを選択するにはクリック + シフト、項目グループのメンバーを個別に選択するにはクリック + Ctrl、単一の項目を選択するにはクリック)。
マウスの左ボタンをクリックして押したままにしてこれらのアイテムのドラッグを開始したいのですが、アイテムの選択が解除されます...そしてマウスが動いても、マウスが上にあるものは何でも選択されます。マウスイベントを処理して、通常はデフォルトの選択を許可するが、アイテムがドラッグされている場合は選択/選択解除を許可するにはどうすればよいですか?
ダウンクリックイベントを処理すると、選択の変更が同時に発生します...クリックがまだダウンしている間にドラッグが開始された場合にのみ、ドラッグアンドドロップと選択の変更であることがわかります。
コントロールの基本的な XAML は次のとおりです...
<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>
わかりましたので、previewmousedown イベントと preview mouse up イベントを処理しました...コントロール キーまたはシフト キーが押された場合、ハンドル フラグを設定しません...それ以外の場合は、処理された引数を true に設定します (そのため、選択の変更は発生しません) 次に、previewmouseup イベントで、"selected" 値を true に設定して単一の選択を完了します (これも Shift または Ctrl が押された場合のみ)。したがって、これはちょっとうまくいきます...しかし、シフトブロック選択は、選択の有効な開始点としてプログラムで選択したアイテムを使用せず、代わりにシフトまたはCtrlキーを使用してクリックされた最初のアイテムに移動します(たとえ私が選択したすべての項目を手動でクリアしました)。
ソースは次のとおりです。
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;
}
}
}