使用 gon-wpf 的 ListBox 拖放 - 使选择保持活动状态

Posted

技术标签:

【中文标题】使用 gon-wpf 的 ListBox 拖放 - 使选择保持活动状态【英文标题】:ListBox Drag drop using gong-wpf - keep selection alive 【发布时间】:2016-06-03 01:38:08 【问题描述】:

我正在使用 gong-wpf 库通过在数据绑定列表框中拖放来重新排序项目:

<ListBox ItemsSource="Binding Collection"
 dd:DragDrop.IsDragSource="True"
 dd:DragDrop.IsDropTarget="True" />

是否有一个简单的解决方案可以让拖动的项目在拖放到新位置时保持其 IsSelected 值?不幸的是,每个拖放操作都会清除 listBox SelectedItem。

我已经考虑过实现 IDropTarget 接口,然后在放置处理程序中执行此操作。但在这种情况下,我必须自己完全实现重新排序逻辑。真的没有更简单的解决方案吗?

【问题讨论】:

如果你实现了 IDragHandler,gong-wpf 将使用 "DefaultDropTarget" 为你处理重新排序。投递成功后仍有回调。 对不起,我只在 libary 命名空间中找到了接口 IDragInfo、IDragSource、IDropInfo、IDropTarget。在哪里可以找到 IDragHandler? 我想我有一个非常旧的版本。它可能已重命名为 IDropTarget。 我已经尝试实现包含 DragOver(...) 和 Drop(...) 的 IDropTarget 接口。实现 DragOver(...) 没有问题,但是在 Drop(...) 中,我不知道自己编写重新排序逻辑的解决方法。此外,我尝试实现重新排序逻辑,但 dropInfo.InsertPosition 有时会为我提供错误的值。 【参考方案1】:

尝试添加PreviewMouseLeftButtonDown 事件。

这样,

public DragDropWindow()

    Style itemContainerStyle = new Style(typeof(ListBoxItem));
    itemContainerStyle.Setters.Add(new Setter(ListBoxItem.AllowDropProperty, true));
    itemContainerStyle.Setters.Add(new EventSetter(ListBoxItem.PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(s_PreviewMouseLeftButtonDown)));
    itemContainerStyle.Setters.Add(new EventSetter(ListBoxItem.PreviewMouseMoveEvent, new MouseEventHandler(s_PreviewMouseMoveEvent)));
    listbox1.ItemContainerStyle = itemContainerStyle;

拖放过程

void s_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)

     if (sender is ListBoxItem)
      
         ListBoxItem draggedItem = sender as ListBoxItem;
         DragDrop.DoDragDrop(draggedItem, draggedItem.DataContext, DragDropEffects.Move);
         draggedItem.IsSelected = true;
      

或者

添加PreviewMouseMoveEvent

这样,

void s_PreviewMouseMoveEvent(object sender, MouseEventArgs e)
    
         if (sender is ListBoxItem && e.LeftButton == MouseButtonState.Pressed)
          
             ListBoxItem draggedItem = sender as ListBoxItem;
             DragDrop.DoDragDrop(draggedItem, draggedItem.DataContext, DragDropEffects.Move);
             draggedItem.IsSelected = true;
          

    

以上代码是一个基本主题,您可以根据需要进行更改。它可以在控件内部或外部。

更多参考请见here

【讨论】:

感谢您的回答!不幸的是,它不起作用(重新排序后没有选择任何项目)。

以上是关于使用 gon-wpf 的 ListBox 拖放 - 使选择保持活动状态的主要内容,如果未能解决你的问题,请参考以下文章

拖放后在Treeview中获取子项的名称

ZK MVC在两个Listbox之间拖放

使用拖放重新排序winforms列表框?

Avalonia跨平台入门第八篇之控件的拖放

如何通过拖放同步两个列表框元素?

Avalonia跨平台入门第十四篇之ListBox折叠列表