Привязать позицию Line к позиции элемента в пользовательском контроле - PullRequest
0 голосов
/ 31 октября 2010

У меня есть холст, содержащий определенные пользовательские элементы управления.

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

Пользовательский контроль содержит макет с сетками, стековыми панелями и т. Д., В котором может быть расположен элемент.

Для пользовательского контроля я бы получил свойства Canvas.Left и Canvas.Top, но так как я не хочу связываться с usercontrol, а с элементом, который он содержит, как бы я это сделал? (Таким образом, если изменяется макет usercontrol, учитывается новая позиция элемента)

1 Ответ

1 голос
/ 31 октября 2010

Давайте определим, что здесь есть 3 вещи:

«Линия» привязана к «Ребенку», который содержится в «Родителе».

Линия должна установить свой Canvas.Top иCanvas.Left для Binding on Child, используя ValueConverter, которому необходим доступ к Parent.

ValueConverter вернет Parent.Left + Child.GetPosition (Parent) .Left

(иликакими бы точными ни были методы поиска).Важно то, что Ребенок получает свою позицию относительно Родителя и добавляет в позицию Родителя.

(Разработка комментария к публикации) Таким образом, вы указываете строку следующим образом:

<Line X1="50" Y1="50" X2="200" Y2="200" />

Это означает, что вы применяете привязку к каждому из этих указателей координат.Вероятно, вам лучше всего передать X или Y в ValueConverter в качестве ConverterParameter, чтобы сэкономить на написании слишком много дублирующего кода.

Ваш первоначальный вопрос указывает, что вы ищете X1, Y1.Я не знаю, что вы хотите, чтобы был другой конец линии, похоже, что это где-то исправлено.Или, если речь идет о другом элементе, вы делаете в основном тот же трюк - это сработает только для одного очка.Предположим на данный момент, что вы всегда хотите, чтобы другая точка была 100 100.

Итак, ваша линия указана так:

<Line X1="{Binding ElementName=yourTarget, ConverterParameter=X, Converter={StaticResource targetLocationExtractor}}" Y1="{Binding ElementName=yourTarget, ConverterParameter=Y, Converter={StaticResource targetLocationExtractor}}" X2="200" Y2="200" />
...