Перехватывать перетаскивание и изменение размера пользовательских дочерних элементов управления холстом 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.

Официальная документация по расширяемости дизайнеров выглядит несколько смущающей для меня. Мне также не повезло, что я нашел этот вопрос в Интернете. Поэтому любые полезные подсказки будут высоко оценены - например, книги, статьи, примеры, ссылки на источники ссылок и т. Д.

0 ответов

Другие вопросы по тегам