使用WPF平滑文本动画(Marquee)

时间:2010-06-09 00:09:51

标签: wpf animation marquee

尝试使用流畅的文本动画构建选取框控件。目前的努力包括:

  • 使用翻译转换
  • 在Canvas依赖项属性(左,右)上使用动画
  • 在自定义依赖项属性(Point)上使用动画并使用绘图视觉效果(formattedtext)
  • 使用CompositionTarget.Rendering

但动画仍然不稳定且资源密集(2-10%CPU)。

默认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性能工具和检查RenderCapability.Tier)
  • 冻结任何可以想象的对象
  • 禁用任何位图效果和透明度
  • 检查所有选框控件(同样的问题)

经过测试:

  • CPU:Intell core 2 duo(T6600)@ 2.2Ghz
  • RAM:4GB
  • GPU:NVidia GeForce 9600M GS(最新驱动程序)
  • 操作系统:Windows 7(64位)

任何想法(或更好的代码示例)?

从回复来看,这似乎不是一个wpf问题(其他选框控件对其他人来说效果不错,但不适合我),坚果我在我测试过的每台机器上都遇到了同样的问题。

3 个答案:

答案 0 :(得分:4)

如果出现以下情况,您的动画将完全在MilCore图层处理:

  1. 您的TranslateTransform是RenderTransform(不是LayoutTransform),
  2. 您使用简单的动画,例如DoubleAnimation和
  3. 您的对象没有裁剪或不透明度计算
  4. 尝试在TextBlock上使用DoubleAnimation-animated动画TranslateTransform进行RenderTransform,TextBlock是具有默认设置的Window的直接子项。

    • 如果这仍然很慢,你的Direct3D系统会有些慢,因为根本不涉及托管代码,而且MilCore的调用非常简单,但是

    • 如果它能够顺利有效地工作,请逐步将其更改为效果不佳的代码,以查看哪些更改会导致速度减慢。

    鉴于您对Jobi Joy的回答,我怀疑问题出在您的硬件或Direct3D设置中,但唯一可以找到的方法是测试它。

答案 1 :(得分:3)

如果您使用的是WPF 4.0,请尝试在您动画的元素上设置CacheMode="BitmapCache"(在XAML中),在这种情况下,可能是TextBlock

答案 2 :(得分:1)

希望这可以帮到你 - http://jobijoy.blogspot.com/2008/08/silverlight-marquee-control.html

还可以找到WPF版本here