Плавная текстовая анимация (Marquee) с использованием WPF - PullRequest
6 голосов
/ 09 июня 2010

Попытка создать элемент управления с плавной текстовой анимацией. Текущие усилия включают в себя:

  • Использование преобразования translate
  • Использование анимации в свойствах зависимостей Canvas (слева, справа)
  • Использование анимации для пользовательского свойства зависимости (Point) и использование визуальных элементов рисования (formattedtext)
  • Использование CompositionTarget.Rendering

Но анимация все еще прерывистая и ресурсоемкая (2-10% ЦП).

Тестовый код, используемый в окне wpf по умолчанию, которое, как я полагаю, должно создавать плавную анимацию:

   <TextBlock x:Name="_box" FontSize="64" CacheMode="BitmapCache" Text="lorem ipsum">
        <TextBlock.RenderTransform>
            <TranslateTransform x:Name="AnimatedTranslateTransform" X="0" Y="0" />
        </TextBlock.RenderTransform>
        <TextBlock.Triggers>
            <EventTrigger RoutedEvent="TextBlock.Loaded">
              <BeginStoryboard>
                <Storyboard>
                  <DoubleAnimation
                    Storyboard.TargetName="AnimatedTranslateTransform" 
                    Storyboard.TargetProperty="X"
                    From="-300" To="300" Duration="0:0:5" 
                    AutoReverse="True" RepeatBehavior="Forever" />
                </Storyboard>
              </BeginStoryboard>
            </EventTrigger>
          </TextBlock.Triggers>
    </TextBlock>

Контрольный список:

  • Подтверждено, что не выполняется программный рендеринг (ms Performance Tool и проверка RenderCapability.Tier)
  • Вызов замораживания на любом мыслимом объекте
  • Отключен любой растровый эффект и прозрачность
  • Проверены все элементы управления выделением (те же проблемы)

Проверено на:

  • Процессор: Intell Core 2 Duo (T6600) @ 2,2 ГГц
  • RAM: 4 ГБ
  • GPU: NVidia GeForce 9600M GS (последние версии драйверов)
  • ОС: Windows 7 (64-битная)

Есть идеи (или еще лучше пример кода)?

Судя по ответам, это не проблема wpf (другие элементы управления marquee работают хорошо для других, но не для меня), но на всех машинах, на которых я это тестировал, возникают те же проблемы.

Ответы [ 3 ]

4 голосов
/ 09 июня 2010

Ваша анимация будет полностью обрабатываться на слое MilCore, если:

  1. Ваш TranslateTransform является RenderTransform (не LayoutTransform), а
  2. Вы используете простую анимацию, такую ​​какDoubleAnimation и
  3. Ваш объект не имеет отсчетов или вычислений непрозрачности

Попробуйте использовать анимированный DoubleAnimation TranslateTransform для RenderTransform в TextBlock, который является прямым потомком окна с настройками по умолчанию.

  • Если это все еще медленно, в вашей системе Direct3D что-то медленное, потому что управляемый код вообще не задействован и вызовы MilCore очень просты, но

  • Если он работает плавно и эффективно, постепенно измените его на свой плохо работающий код, чтобы увидеть, какие изменения вызывают замедление.

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

3 голосов
/ 09 июня 2010

Если вы используете WPF 4.0, попробуйте установить CacheMode="BitmapCache" (в XAML) для элемента, который вы анимируете, в этом случае, вероятно, TextBlock.

1 голос
/ 09 июня 2010

Надеюсь, что это может помочь вам - http://jobijoy.blogspot.com/2008/08/silverlight-marquee-control.html

И версию WPF также можно найти здесь

...