使用 WPF 平滑文本动画(选取框)

Posted

技术标签:

【中文标题】使用 WPF 平滑文本动画(选取框)【英文标题】:Smooth text animation (Marquee) using WPF 【发布时间】:2011-03-01 10:39:50 【问题描述】:

尝试构建一个带有平滑文本动画的选取框控件。目前的努力包括:

使用平移变换 在 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 内存:4GB GPU:NVidia GeForce 9600M GS(最新驱动程序) 操作系统:Windows 7(64 位)

有什么想法(或更好的代码示例)吗?

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

【问题讨论】:

似乎有些电脑有问题。构建发布版本也有很大帮助。 【参考方案1】:

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

WPF版本也可以找到here

【讨论】:

是的,它是我看过的控件之一(包括 wpf 版本),它并不流畅,而且对于这样一个简单的任务来说它是相当耗费资源的。 我在一些旧硬件上尝试了 Jobi Joy 示例应用程序的 Silverlight 和 WPF 版本。两者的动画都很流畅并且使用的资源很少,尽管它们的动画远不止一个简单的选取框。我认为导致问题的硬件或环境一定有什么特别之处。也许您应该在您的问题中添加详细的硬件、操作系统、NET Framework 规范和资源使用情况编号,以便其他人可以尝试复制您的问题。 这真的很奇怪——我在文本和图像上测试过的每台机器每 2 到 5 秒抖动一次。我已经更新了我的问题。 虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。【参考方案2】:

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

    您的 TranslateTransform 是 RenderTransform(不是 LayoutTransform),并且 您使用了一个简单的动画,例如 DoubleAnimation,并且 您的对象没有剪裁或不透明度计算

尝试在 TextBlock 上使用 DoubleAnimation 动画 TranslateTransform 进行 RenderTransform,该 TextBlock 是具有默认设置的 Window 的直接子级。

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

如果它运行顺利且高效,请逐步将其更改为性能不佳的代码,以查看导致速度变慢的更改。

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

【讨论】:

我已经尝试过了(请参阅更新的问题) - 我仍然遇到同样的问题。如果我正在处理的机器出现问题,您能想到任何诊断方法吗?【参考方案3】:

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

【讨论】:

好主意 - 但它不能解决我的问题。看来问题出在我的机器(操作系统或硬件)上,但我什么都想不出来。 天哪!我在涉及大约 50 个 UI 元素的动画上遇到了问题。这困扰了我几个星期,但被这一属性清除了。 Arg,为什么我花了这么长时间才找到这个?

以上是关于使用 WPF 平滑文本动画(选取框)的主要内容,如果未能解决你的问题,请参考以下文章

其他元素后面的 Wpf 文本选取框

WPF 滚动选取框 - HandOffBehavior

如何在 WPF 中制作选取框进度条?

UILabel 文本发光和选取框

如果文本字符串小于屏幕大小,则使 textview 选取框

jquery 选中文本框 jquery 文本框样式 jquery 改变样式