我有一个包含程序中文件的列表视图对象。默认的列表视图行为允许我对列表执行所有选择操作(单击+shift 选择块,单击+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 事件......如果按下控制键或 shift 键,我不设置句柄标志......但否则我将处理的参数设置为 true (所以不会发生选择更改)然后在 previewmouseup 事件中,我通过将“selected”值设置为 true 来完成单个选择(再次仅在按下 shift 或 ctrl 时)。所以这有点工作......但是 shift-block-selection 不使用我以编程方式选择的任何项目作为选择的有效起点,而是转到使用 shift 或 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;
}
}
}