WPF从具有SelectionMode = Extended的ListBox拖放

HCL*_*HCL 6 wpf drag-and-drop listbox itemscontrol

我有一个ListBox,并希望扩展选择模式.我还想要实现拖放功能.现在的问题是,如果被点击所选项目的鼠标,它会立即被选定为单一选择,而不是等待到鼠标释放事件这样做的.

由于这种行为,开始拖动多个项目是为用户准不可能的,因为他总是点击选择要开始拖动,选择切换到与下鼠标,并与该项目开始拖拽操作的项目.

这个问题是否有一个很好的解决方法,或者甚至存在官方解决方案?

Geo*_*Cox 8

这就是我所做的.在DragDrop代码中,订阅PreviewMouseLeftButtonDown.如果选择了您已单击的项目,则将e.Handled设置为true.

在下面的示例中,我将列表框项目的一部分标识为拖动夹点(带有凸起),以便我可以区分项目和拖动表面.我只需要获取列表框项目数据模板和拖放行为以同意拖动夹点元素的名称.

我正在进行的工作中的PreviewMouseLeftButtonDown:

private void ItemsControl_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    dragStartPoint = e.GetPosition(null);

    ItemsControl itemsControl = this.AssociatedObject as ItemsControl;
    if (itemsControl != null)
    {
        this.sourceItemContainer = itemsControl.ContainerFromElement((Visual)e.OriginalSource) as FrameworkElement;
    }

    // If this is an multiple or extended selection list box, and on a drag grip, then ensure the item being hit is selected
    // This prevents the ItemsControl from using this MouseDown to change selection, except over a selected item's drag grip.            
    if ((this.IsMultipleSelectionListBox() == true) && (this.IsOriginalSourceDragGrip(e) != false) && (this.IsSourceListBoxItemSelected() == true))
    {
        e.Handled = true;
    }
}
Run Code Online (Sandbox Code Playgroud)