WPF ListView 拖动
时间: 2023-06-11 16:06:42 浏览: 124
WPF 的 ListView 控件不支持拖拽操作,但你可以通过一些技巧来实现拖拽功能。
一种实现方式是使用 PreviewMouseMove 事件来捕获鼠标移动事件,并在拖拽时创建一个拖拽效果的元素。当鼠标释放时,你可以将拖拽的元素插入到目标位置。
以下是一个简单的示例代码:
```xml
<ListView x:Name="listView" ItemsSource="{Binding Items}">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<EventSetter Event="PreviewMouseMove" Handler="OnItemPreviewMouseMove"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
```
```csharp
private ListViewItem draggedItem;
private Point startPoint;
private void OnItemPreviewMouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed && draggedItem == null)
{
startPoint = e.GetPosition(null);
draggedItem = (ListViewItem)sender;
draggedItem.IsSelected = true;
DataObject dataObject = new DataObject(draggedItem.DataContext);
DragDrop.DoDragDrop(draggedItem, dataObject, DragDropEffects.Move);
}
}
private void OnListViewDrop(object sender, DragEventArgs e)
{
if (draggedItem != null)
{
Point endPoint = e.GetPosition(null);
double dx = endPoint.X - startPoint.X;
double dy = endPoint.Y - startPoint.Y;
if (Math.Abs(dx) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(dy) > SystemParameters.MinimumVerticalDragDistance)
{
int index = listView.Items.IndexOf(draggedItem.DataContext);
listView.Items.Remove(draggedItem.DataContext);
listView.Items.Insert(index, draggedItem.DataContext);
}
draggedItem.IsSelected = false;
draggedItem = null;
}
}
```
在上面的示例中,我们使用 PreviewMouseMove 事件来捕获鼠标移动事件,并在拖拽时创建一个 ListViewItem 元素作为拖拽效果。在拖拽过程中,我们使用 DragDrop.DoDragDrop 方法来启动拖拽操作,并将需要拖拽的数据对象传递给它。
当鼠标释放时,我们可以在 ListView 的 Drop 事件中获取拖拽的元素,并将它插入到目标位置。请注意,在实现拖拽操作时,你需要设置 ListViewItem 的 IsSelected 属性,以便让 ListView 控件知道哪个元素被拖拽了。
阅读全文