Общий способ установки границ элемента

Я пишу приложение, которое в основном представляет собой дизайнер, очень похожий на дизайнер Expression Blend или Visual Studio. Таким образом, в основном на поверхности дизайна есть куча элементов пользовательского интерфейса, и вы можете делать такие вещи, как перетаскивание, изменение размера, поворот и т. д.

Основным элементом управления контейнером, который будет поверхностью дизайна, может быть любой элемент управления, производный от Panel, который включает такие элементы управления, как Canvas, Grid и т. д. Эта ситуация, означающая поддержку любого элемента управления, производного от Panel, в качестве поверхности дизайна, поднимает проблему там, где мне нужно чтобы найти общий способ установить размер и расположение дочерних элементов управления на этой поверхности, независимо от типа элемента управления на другой панели.

Я использую вызов UIElement.Arrange() для перемещения/изменения размера элементов управления, и это работает, но после обновления макета элемента управления родительской панели, например, при изменении его размера, все мои изменения сбрасываются до значений по умолчанию. Мне также известна текущая логика макета с двумя проходами в элементах управления панели WPF, но у меня нет возможности получить элемент управления и использовать его в качестве фонового объекта.

Короче говоря, есть ли общий способ добиться того, чего я хочу, установив размер/положение дочернего элемента управления в элементе управления, производном от панели, поскольку я вижу, что Blend/VS Designer распознает, как позиционировать элементы управления в элементе управления, производном от панели? Или они также жестко закодированы для известных элементов управления, производных от Panel?

Заранее спасибо...

Озден


person Özden Irmak    schedule 30.09.2009    source источник


Ответы (2)


Вы пытались изменить поле на своем дочернем элементе управления, что позволит вам изменить его положение. Я не думаю, что это оптимальный способ сделать это, но он будет работать.

person viggity    schedule 30.09.2009
comment
Спасибо за ответ ... Для управления сеткой Margin используется, как вы сказали. Но, например, когда вы используете Canvas в Blend, вместо него устанавливается свойство Canvas.Left. Я просто хочу понять, доступен ли общий способ понять возможности родителя и установить правильное свойство для позиционирования. До сих пор все мои исследования приводят к тому, что это невозможно, возможно, blend/VS тоже делает это жестко. Возможно, вместо этого мне следует использовать TranslateTransform, и это единственное, что я нашел общего во всех возможных сценариях. - person Özden Irmak; 01.10.2009

Вы не можете этого сделать, весь смысл различных типов панелей в том, что они по-разному позиционируют своих детей.

Холст предназначен для ручного управления размером и положением, в сетке вы можете установить отступ, но нет возможности управлять положением в StackPanel, WrapPanel или DockPanel (или радиальной панели, которую вы можете найти практически в любой коллекции образцов WPF)

person Nir    schedule 22.11.2009