Поскольку элементы не находятся непосредственно внутри холста, вам нужно пройти вверх по визуальному дереву, пока не найдете холст. Я обычно использую следующий метод расширения, чтобы сделать это:
public static T FindAncestor<T>(this DependencyObject obj)
where T : DependencyObject
{
DependencyObject tmp = VisualTreeHelper.GetParent(obj);
while(tmp != null && !(tmp is T))
{
tmp = VisualTreeHelper.GetParent(tmp);
}
return tmp as T;
}
Поместите указанный выше метод в статический класс и импортируйте пространство имен, в котором он объявлен. В коде DraggableExtender
просто замените эту строку:
Canvas canvas = element.Parent as Canvas;
С этим:
Canvas canvas = element.FindAncestor<Canvas>();