Найти X/Y UIElement внутри Canvas

У меня есть UIElements (круги/прямоугольники) внутри холста. Я хочу получить X/Y для UIElement относительно его родителя (Canvas). Но я не могу получить его.

Для этого есть несколько решений. Я попытался сделать это (найти положение Button/UIElement на экране относительно сетки Windows Phone)

var transform = button.TransformToVisual(grid);        
Point absolutePosition = transform.Transform(new Point(0, 0));

Но я получаю 0,0 в absolutePosition. Я могу правильно видеть круги на карте. Но я не уверен, почему я ошибаюсь X/Y.

Вот мой фактический код.

Canvas.SetLeft(shape, Position.X);
Canvas.SetBottom(shape, Position.Y);
canvas.Children.Add(shape);
var transform = shape.TransformToVisual(canvas);        
Point absolutePosition = transform.Transform(new Point(0, 0));

Что бы я ни передал transform.Transform, я получаю это на выходе.


person fhnaseer    schedule 26.01.2015    source источник
comment
Прикрепленные свойства холста (сверху, слева, снизу, справа) не подходят? Они управляют позициями X/Y дочерних элементов Canvas.   -  person Steven Rands    schedule 26.01.2015
comment
Позже я использовал Canvas.GetLeft. Они работают нормально. Я искал в stackoverflow, и единственное решение, которое я смог найти, было это (преобразование). Поэтому мне было интересно, почему это не работает на моей стороне,   -  person fhnaseer    schedule 26.01.2015
comment
Вы пробовали ответ @Arie? Оглядываясь на SO, кажется, что TranslatePoint является предпочтительным подходом. Просто замените ссылку на grid в его/ее примере ссылкой на ваш холст.   -  person Steven Rands    schedule 27.01.2015


Ответы (1)


Проблема в том, что вы изменили свой макет, и на данный момент его еще предстоит оценить и измерить. «преобразования» следует применять только после того, как ваш макет был оценен и измерен.

Попробуйте использовать TranslatePoint вместо этого.

Point positionOnGrid = shape.TranslatePoint(new Point(0, 0), grid);

или попробуйте позвонить UpdateLayout после canvas.Children.Add(shape); и перед вызовом TransformToVisual.

person Arie    schedule 26.01.2015