Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > TranslatePoint возвращает старые координаты


Автор: Anyone 12.10.2009, 12:40
Для того чтобы узнать реальные координаты повернутого на угол объекта, написал функцию GetRealPointХХХ().
Но, как выяснилось позже, для этих же целей можно использовать стандартную TranslatePoint, но возникла проблема.
Код

            Point pointTopLeftCorner = _canvasItem.GetRealPointTopLeftQuad(
                new Point((double)_canvasItem.GetValue(Canvas.LeftProperty),
                    (double)_canvasItem.GetValue(Canvas.TopProperty)));

            var canvas = VisualTreeHelper.GetParent(_canvasItem) as Canvas;
            if (canvas != null)
                pointTopLeftCorner = _canvasItem.TranslatePoint(new Point(0, 0), canvas);

            _canvasItem.RenderTransformOrigin = new Point(
                    (Margin.Left + Width / 2.0)/_canvasItem.ActualWidth, 
                    (Margin.Top + Height / 2.0)/_canvasItem.ActualHeight);

            Point pointTopLeftCornerAfter1 = _canvasItem.GetRealPointTopLeftQuad(
                new Point((double)_canvasItem.GetValue(Canvas.LeftProperty),
                    (double)_canvasItem.GetValue(Canvas.TopProperty)));

            Point pointTopLeftCornerAfter2;
            if (canvas != null)
                pointTopLeftCornerAfter2 = _canvasItem.TranslatePoint(new Point(0, 0), canvas);

После изменения RenderTransformOrigin повернутого объекта, его координаты изменяются. При этом моя функция правильно считает новые координаты ( присваиваются в pointTopLeftCornerAfter1), а TranslatePoint упорно возвращает старые координаты, хотя при следующем вызове функции и до трансформации вновь правильно.
Пытался вызывать функции InvalidateArrange(), InvalidateMeasure(), InvalidateVisual() для канваса и объекта после изменения RenderTransformOrigin, но ничего не помогло.
В чем проблема?

Автор: math64 12.10.2009, 13:03
По всей видимости, нужно вызвать InvalidateArrange() (а вероятно, она сама вызовется при изменении RenderTransformOrigin), но пользоваться TranslatePoint() можно будет только после того, как объект отрисуется на новом месте (после вызова ArrangeOverride()).

Автор: Anyone 12.10.2009, 13:12
Цитата(math64 @ 12.10.2009,  13:03)
По всей видимости, нужно вызвать InvalidateArrange() (а вероятно, она сама вызовется при изменении RenderTransformOrigin), но пользоваться TranslatePoint() можно будет только после того, как объект отрисуется на новом месте (после вызова ArrangeOverride()).

Я с этим согласен, но как мне узнать что ArrangeOverride() уже вызвался, вернее как форсировать это событие, чтоб я мог воспользоваться функцией TranslatePoint()?

Автор: math64 12.10.2009, 13:41
IsArrangeValid означает что Arrange() вызывался после последнего InvalidateArrange(). Самому Arrange() вызывать нельзя.

Автор: Anyone 12.10.2009, 14:33
Неужели у задачи нету простого решения?
Естессно я могу использовать свою функцию, на которую убил несколько дней, но мне все же интересно написать отимальный код.

А IsArrangeValid действительно имеет значение false перед вызовом TranslatePoint(), даже если не вызываю InvalidateArrange().

Автор: Anyone 12.10.2009, 14:51
Проблему решил: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b294e5be-2a19-4d45-8421-d9139366b2cd

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)