Я реализовал нечто подобное некоторое время назад.
Все мои перетаскиваемые элементы управления унаследованы от одного базового элемента управления.Базовый элемент управления имел событие Loaded
, которое проверяло бы VisualTree
для FrameworkElement
с именем PART_DragHandle
, и, если оно находило, оно сообщало бы моему коду перетаскивания использовать этот элемент управления для инициирования перетаскивания.Если он не найдет его, он будет использовать весь элемент управления.
Код Drag / Drop, с которого я начал, взят из блога Беа Столльниц , хотя я немного его изменил.Я не помню, что включает в себя ее код, но у меня был собственный DependencyProperty для DragHandle, и я мог установить его, используя что-то вроде этого:
void UserControl_Loaded(object sender, EventArgs e)
{
DependencyObject control = sender as DependencyObject;
if (control == null) return;
var dragHandle = VisualTreeHelpers.FindChild<FrameworkElement>(
control, "PART_DragHandle");
if (dragHandle != null)
this.dragDropManager.SetDragHandle(dragHandle);
else
this.dragDropManager.SetDragHandle(control);
}
Чтобы перемещаться по VisualTree и находить мой дескриптор перетаскивания, я использовал нескольковспомогательные классы, которые я выложил здесь .