Перехватывать перетаскивание и изменение размера пользовательских дочерних элементов управления холстом WPF во время разработки
Мне удалось добавить дизайнера времени разработки в элемент управления WPF, но как мне взять контроль над теми, что встроены в конструктор? (другими словами, я хочу, чтобы моя функция вызывалась, когда кто-то перетаскивает или изменяет размер элемента управления, используя стандартные пальцы / резиновые полосы / украшения /...)
,
Ниже приведены подробности того, чего я пытаюсь достичь:
Я пишу WPF Canvas-подобный элемент управления, в котором есть собственные правила для размещения и определения размера дочерних элементов. (он тоже должен вращаться, но это другой вопрос)
<my:MyCustomCanvas>
<my:SomeControl my:Name="child control #1" Canvas.Left="20" Canvas.Top="30"/>
<my:SomeOtherControl my:Name="child control #2" Canvas.Left="70" Canvas.Top="80"/>
</my:MyCustomCanvas>
Один из способов добиться этого - переопределить ArrangeOverride() следующим образом:
public class CustomCanvas : Canvas
{
protected override Size ArrangeOverride(Size arrangeSize)
{
foreach (UIElement child in InternalChildren)
{
double left = child.GetValue(Canvas.LeftProperty) - this.GetValue(ActualWidthProperty) / 2;
double top = child.GetValue(Canvas.TopProperty) - this.GetValue(ActualHeightProperty) / 2;
child.Arrange(new Rect(new Point(left, top), child.DesiredSize));
}
return arrangeSize;
}
}
Это работает, но если вы попытаетесь перетащить или изменить размер дочернего элемента управления в конструкторе, он переместится туда, где он был бы, если бы он был на обычном холсте WPF (т. Е. X = Left, а не X = Left - Width / 2 как ArrangeOverride диктует)
Похоже, мне нужно взять под контроль дизайнера. Microsoft даже предоставила документацию, как это сделать: Пошаговое руководство. Создание Adorner во время разработки. Похоже, что это работает, однако мне не удалось найти способ контролировать, как украшатели , встроенные в визуальную студию, работают (те большие размеры, которые появляются вокруг элемента управления, когда он выбран), только как добавлять новые. Конечно, я мог бы просто добавить немного и поручить кому-либо не трогать стандартные, но это выглядит как уродливый клудж.
Для целей этого вопроса можно с уверенностью предположить, что у меня есть доступ к исходному коду (т.е. я могу переопределить методы) как canvas, так и его дочерних элементов, хотя предпочтительнее использовать методы, которые требуют только изменения родительского canvas.
Официальная документация по расширяемости дизайнеров выглядит несколько смущающей для меня. Мне также не повезло, что я нашел этот вопрос в Интернете. Поэтому любые полезные подсказки будут высоко оценены - например, книги, статьи, примеры, ссылки на источники ссылок и т. Д.