Плавная анимация текста (Marquee) с использованием WPF

StackOverflow https://stackoverflow.com/questions/3002271

  •  25-09-2019
  •  | 
  •  

Вопрос

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

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

Но анимация по-прежнему прерывистая и ресурсоемкая (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 и проверка возможности рендеринга.Уровень)
  • Вызов freeze для любого мыслимого объекта
  • Отключен любой растровый эффект и прозрачность
  • Проверил все элементы управления marquee (те же проблемы)

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

  • Процессор:Intel core 2 duo (T6600) с частотой 2,2 ГГц
  • ОЗУ:4 ГБ
  • Графический процессор:NVidia GeForce 9600M GS (последние версии драйверов)
  • Операционная система:Windows 7 (64-разрядная версия)

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top