Я нашел демонстрационную версию 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, подключает его к модулю и затем сообщает раскадровку.Он вызывается в цикле, один раз для каждого из движущихся модулей, которые в данный момент не перетаскиваются мышью.