Как заставить анимацию / приложение Silverlight работать так же / в WPF? - PullRequest
2 голосов
/ 02 июля 2011

Я нашел демонстрационную версию Silverlight, которая отлично работает @ http://blog.allaboutprogress.com/2010/04/silverlight-dashboards-part-i/

Однако я хочу, чтобы приложение работало в WPF.Я создал проект в Silverlight и запустил его, затем скопировал файлы в приложение WPF.

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

1) В silverlight все движется плавно, независимо от размераформа.В WPF анимация становится неустойчивой, когда анимация происходит слишком часто, а также имеет тенденцию работать хуже при увеличении размера содержащего окна.

2) В Silverlight как перетаскиваемый модуль и другие модули, которым требуетсячтобы не мешать, оживить гладко.В wpf перемещаемый модуль не перемещается, пока вы перетаскиваете мышь, но другие модули по-прежнему мешают, когда вы перетаскиваете мышь.Затем, когда вы перемещаете мышь, модуль быстро перемещается в то место, в котором вы выпустили мышь.Кроме того, анимация других модулей не выглядит долго (например, драйвер графической системы перегружен).

Почему поведение такого радикально отличается для одного и того же xaml и кода между wpf и silverlight,и как я могу заставить WPF анимировать так же красиво, как это делает оригинальный код Silverlight?

Вот изменение, которое я должен был сделать, чтобы заставить работать версию WPF.

Итак, сначала я создал всекак они это делали на Silverlight, и когда я впервые запустил его, я получил ошибку:

{"System.Windows.Media.Animation.DoubleAnimation 'не может использовать исходное значение по умолчанию' NaN '".}

Итак, я исправил это, обновив метод

void TranslateAnimation(UIElement element, double newLeft, double newTop, double ts)

, добавив следующий код в начале метода:

void TranslateAnimation(UIElement element, double newLeft, double newTop, double ts)
  {
   if (double.IsNaN(Canvas.GetLeft(element)))
   {
    element.SetValue(Canvas.LeftProperty, Convert.ToDouble(0));
   }

   if (double.IsNaN(Canvas.GetTop(element)))
   {
    element.SetValue(Canvas.TopProperty, Convert.ToDouble(0));
   }
   ...

Это сделало его такимкод запускается / запускается без сбоев.

Этот метод создает объект анимации Storyboard и Double, подключает его к модулю и затем сообщает раскадровку.Он вызывается в цикле, один раз для каждого из движущихся модулей, которые в данный момент не перетаскиваются мышью.

1 Ответ

0 голосов
/ 17 августа 2011

Это действительно странное поведение, я полагаю, оно связано с одним из следующих действий:

social.msdn: обычно плавное отставание во время анимации WPF

Проблема AllowTransparency

Как и в первой ссылке, вы можете попробовать использовать CompositionTarget.Rendering вместо раскадровки в XAML.Посмотрите на этот пример: Как сделать: рендеринг с интервалом в кадре с использованием CompositionTarget

Кроме того, есть хорошая статья в блоге Мортена Нильсена, в которой объясняются различия между Silverlight и WPF: sharpgis.net

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...