WPF: получить реальную «логическую» позицию Child в родительской панели - PullRequest
5 голосов
/ 22 января 2011

Еще одна проблема из моей серии вопросов о WPF:)

Я создаю пользовательский Decorator, который будет использоваться для украшения Panel с (или это может быть поведение, без разницы).

То, что Decorator имеет дело с элементами, которые находятся в этом Panel (Children свойство Panel).Он прикрепляет некоторые RenderTransform к этим элементам.Теперь мне нужна позиция некоторого элемента («потомка» Panel) относительно самого Panel.Другими словами, мне нужна позиция, если какой-то дочерний элемент в координатном пространстве Panel s.другими словами, я хочу, чтобы смещение, которое было задано методом ArrangeOverride Panel при вызове метода Arrange для Children.

Это кажется простым.Но я не могу найти способ всегда получать правильные координаты.

Этот код

VisualTreeHelper.GetOffset(child)

не работает, когда панель находится внутри ScrollView - она ​​занимает верхнюю частькрайний левый видимый угол Panel как начало координатного пространства, а не самый верхний и самый левый угол Panel.

Код

Point position = child.TransformToAncestor(panel).Transform(new Point(0,0));

не будет работать, когданекоторые преобразования рендеринга уже активны в дочернем элементе Panel.Он вернет позицию преобразованного изображения (с помощью преобразования визуализации) дочернего элемента.Позиция рендеринга.

Та же проблема с этим подходом:

Point panelPosition = panel.PointToScreen(new Point(0, 0));
Point childPosition = child.PointToScreen(new Point(0, 0));
Point position = new Point(childPosition.X - panelPosition.X, childsPosition.Y - panelPosition.Y);

Так что я попытался, но это не сработало.У меня есть 2 похожих вопроса на эту тему, которые были связаны, чтобы упростить проблему, поэтому я получил несколько предложений выше.Теперь я представил проблему в ее полной сложности, надеюсь получить правильный совет.

Если что-то неясно, оставьте комментарий.Спасибо

1 Ответ

0 голосов
/ 22 января 2011

Вы можете "отменить" RenderTransform перед вызовом TransformToAncestor:

Point origin = child.RenderTransform.Inverse.Transform(new Point(0, 0));
Point position = child.TransformToAncestor(listBox).Transform(origin); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...