Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TranslatePoint возвращает старые координаты, сразу после выполнения трансформации 
V
    Опции темы
Anyone
Дата 12.10.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Для того чтобы узнать реальные координаты повернутого на угол объекта, написал функцию 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, но ничего не помогло.
В чем проблема?
PM MAIL   Вверх
math64
Дата 12.10.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



По всей видимости, нужно вызвать InvalidateArrange() (а вероятно, она сама вызовется при изменении RenderTransformOrigin), но пользоваться TranslatePoint() можно будет только после того, как объект отрисуется на новом месте (после вызова ArrangeOverride()).
PM   Вверх
Anyone
Дата 12.10.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



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

Я с этим согласен, но как мне узнать что ArrangeOverride() уже вызвался, вернее как форсировать это событие, чтоб я мог воспользоваться функцией TranslatePoint()?
PM MAIL   Вверх
math64
Дата 12.10.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



IsArrangeValid означает что Arrange() вызывался после последнего InvalidateArrange(). Самому Arrange() вызывать нельзя.
PM   Вверх
Anyone
Дата 12.10.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) Anyone - 12.10.2009, 14:40
PM MAIL   Вверх
Anyone
Дата 12.10.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Проблему решил: решение
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.1025 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.