Вот что я сделал. В своем коде DragDrop подпишитесь на PreviewMouseLeftButtonDown . Если выбран элемент, по которому вы уже щелкаете, установите для e.Handled значение true.
В моем примере ниже я идентифицирую часть элемента списка как ручку для перетаскивания (с выступами), чтобы можно было различать элемент и поверхность перетаскивания. Мне просто нужно было получить шаблон данных элемента списка и поведение перетаскивания, чтобы согласовать имя элемента перетаскивания.
PreviewMouseLeftButtonВниз с моей работы:
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;
}
}