LongListSelector 内的缓慢故事板动画

2024-04-27

我有一个 LongListSelector,其中填充了一些项目。每个项目都有一个子菜单,可以使用滑动动画显示或折叠该子菜单。问题是动画非常慢,具体取决于您在列表中点击的项目。开始和结束的时候很慢,中间很顺利。我怀疑每个动画帧都会使长列表选择器无效,这意味着整个可视化树必须更新其布局。

我使用数据触发器来启动动画。因此,我可以看到许多其他项目上的触发器也被触发,这表明它们正在被重新绘制。它还表明,当您点击列表中间时,触发的其他项目也会少得多。诡异的...

我在github上托管了测试项目:https://github.com/jessetabak/wpanimationproblem https://github.com/jessetabak/wpanimationproblem

长列表选择器:

<phone:LongListSelector x:Name="LongList" Margin="0" Padding="0" ItemsSource="{Binding Items}" 
        HorizontalAlignment="Stretch" Background="Transparent">
    <phone:LongListSelector.ItemTemplate>
        <DataTemplate>
            <wegGooiApp2:ItemView />
        </DataTemplate>
    </phone:LongListSelector.ItemTemplate>

</phone:LongListSelector>

项目视图:

<UserControl.Resources>

        <wegGooiApp2:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />

        <Storyboard x:Key="ShowMenu">
            <DoubleAnimation Storyboard.TargetProperty="(Grid.Height)" 
                             Storyboard.TargetName="Submenu"
                             From="0" To="70" Duration="0:0:0.25" />

            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Submenu"
                                           Storyboard.TargetProperty="(Grid.Visibility)">
                <DiscreteObjectKeyFrame KeyTime="0:0:0">
                    <DiscreteObjectKeyFrame.Value>
                        <Visibility>Visible</Visibility>
                    </DiscreteObjectKeyFrame.Value>
                </DiscreteObjectKeyFrame>
            </ObjectAnimationUsingKeyFrames>

        </Storyboard>

        <Storyboard x:Key="HideMenu">       

            <DoubleAnimation Storyboard.TargetProperty="(Grid.Height)"
                            Storyboard.TargetName="Submenu"
                            From="70" To="0" Duration="0:0:0.25" />

            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Submenu"
                                           Storyboard.TargetProperty="(Grid.Visibility)">
                <DiscreteObjectKeyFrame KeyTime="0:0:0.25">
                    <DiscreteObjectKeyFrame.Value>
                        <Visibility>Collapsed</Visibility>
                    </DiscreteObjectKeyFrame.Value>
                </DiscreteObjectKeyFrame>
            </ObjectAnimationUsingKeyFrames>

        </Storyboard>        

    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <!-- TEST ITEM -->
        <Border Height="70" BorderBrush="Red" Background="Transparent" BorderThickness="1" HorizontalAlignment="Stretch">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>

                <TextBlock Text="Test Item" HorizontalAlignment="Stretch" FontSize="42" />
                <Button Content="v" Grid.Column="1" Tap="Button_Tap" Tag="{Binding}">

                </Button>
            </Grid>
        </Border>

        <!-- SUBMENU -->
        <Border x:Name="Submenu" Grid.Row="1" BorderBrush="Green" BorderThickness="1" 
                Visibility="{Binding SubMenuIsVisible, Converter={StaticResource BoolToVisibilityConverter}, Mode=OneTime}"
                Background="Green" Height="0" Margin="0 0 0 0">

            <i:Interaction.Triggers>
                <ec:DataTrigger Binding="{Binding SubMenuIsVisible}" Value="True">
                    <ec:CallMethodAction MethodName="MenuEnabled"
                                            TargetObject="{Binding ElementName=ThisUserControl, Mode=OneWay}" />

                </ec:DataTrigger>

                <ec:DataTrigger Binding="{Binding SubMenuIsVisible}" Value="False">
                    <ec:CallMethodAction MethodName="MenuDisabled" 
                                         TargetObject="{Binding ElementName=ThisUserControl, Mode=OneWay}" />
                </ec:DataTrigger>
            </i:Interaction.Triggers>

            <TextBlock Text="SubMenu" FontSize="42" />

        </Border>


    </Grid>
</UserControl>

ItemView 代码隐藏:

public partial class ItemView : UserControl
    {            
        private Storyboard _showStoryboard;
        private Storyboard _hideStoryboard;        

        public ItemView()
        {
            InitializeComponent();
            _showStoryboard = (Storyboard) this.Resources["ShowMenu"];
            _hideStoryboard = (Storyboard) this.Resources["HideMenu"];            
            Debug.WriteLine("ItemView CONSTRUCTED");
        }

        private void Button_Tap(object sender, GestureEventArgs e)
        {
            var button = (Button)sender;
            var viewModelItem = (ItemViewModel)button.Tag;

            viewModelItem.SubMenuIsVisible = !viewModelItem.SubMenuIsVisible;            
        }

        public void MenuEnabled()
        {
            Debug.WriteLine("MENU ENABLED!");
            if (Submenu.Visibility == Visibility.Collapsed)
            {
                _showStoryboard.Begin();
            }
        }

        public void MenuDisabled()
        {
            Debug.WriteLine("MENU DISABLED!");
            if (Submenu.Visibility == Visibility.Visible)
            {
                _hideStoryboard.Begin();
            }
        }        

        private void ThisUserControl_LayoutUpdated(object sender, EventArgs e)
        {
            //Debug.WriteLine("ITEMVIEW LAYOUT UPDATED!");
        }
    }

它看起来像什么:

/edit 1

我尝试使用 ScaleTransform 将其转换为独立动画,但这不会为周围的 ui 元素设置动画。要解决此问题,您可以使用布局变换 http://blogs.msdn.com/b/delay/archive/2010/08/26/your-phone-can-turn-into-a-robot-layouttransformer-works-great-on-the-windows-phone-platform.aspx?CommentPosted=true#commentmessage而不是标准的 RenderTransform。经过一些调整后,效果非常好,但是布局变换以缓慢的依赖动画将其返回......


您是正确的,更改 UserControl 高度会导致可视化树的大部分无效,但这是必需的,并且是设计使然。问题是您首先要修改故事板中的控件高度,这不是独立的动画,无法在合成器上运行。

读一读http://msdn.microsoft.com/en-us/library/windows/apps/jj819807.aspx#dependent http://msdn.microsoft.com/en-us/library/windows/apps/jj819807.aspx#dependent尽管这是针对 Windows 应用商店应用程序(并且 SL 中有 EnableDependentAnimations 标志),但其想法仍然相同。您需要找到一种使用独立动画来扩展项目的方法,可能是使用 ScaleTransform。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LongListSelector 内的缓慢故事板动画 的相关文章

  • 实现具有多项选择的项目列表

    在我的 WP8 应用程序中 我想实现一个与标准邮件应用程序中的功能非常相似的功能 用户能够从列表中选择多个项目 我提供了一些屏幕截图来说明此行为 Normal state User taps item s left corner and i
  • Windows Phone 8 检测屏幕解锁

    我的 WP8 应用程序设置为在锁定屏幕下运行 因为即使屏幕锁定时它也需要继续运行 但我希望能够检测用户何时解锁屏幕 我该怎么做 手机解锁时会调用哪些方法 如果有 框架的Unobscured当用户解锁时事件将触发 它也会触发Obscured当
  • Windows Phone 8 HttpClient Get 方法返回奇怪的结果

    我正在开发一个 Windows Phone 8 应用程序 它将一些数据发送到服务器 服务器执行该数据并返回结果 可以随时查询服务器以获取当前执行的状态 可以是正在初始化 正在运行或已完成 仅当执行处于完成状态时输出才可用 用户可以选择通过按
  • 如何将一个 xaml 页面导航到另一页面?

    我有 2 个页面 我需要将 mainpage xaml 导航到 login page xaml 但它让我崩溃你调用的对象是空的 在 Root Children Clear 我在 App xaml 中添加了以下代码 private void
  • 单元测试“混合”WPF/Silverlight 控件

    我正在启动一个新的 WPF Silverlight 自定义控件项目 并希望对此进行单元测试 但是我对如何解决这个问题有点困惑 此控件将基于 WPF 和 Silverlight 的相同代码库 并使用 ifs 和部分类进行少量分叉以消除差异 我
  • WPF/Silverlight 中的动画资源?

    我正在寻找一些好的资源来增强 WPF Silverlight 中使用的动画 故事板概念 有什么指点吗 发布的一个链接是 WPF 特定的 对于 Silverlight 这里还有一些其他资源 MSDN 动画概述 http msdn micros
  • 在 silverlight 中播放视频?

    如何使用 silverlight 播放视频 Visual Studio 是否内置了视频播放器组件 或者我需要制作一个视频播放器 通常情况下 这取决于您的要求 您可以使用Silverlight自带的媒体元素 msdn信息在这里 http ms
  • 如何检测两个同时触摸?

    Windows Phone 8 中的触摸检测利用了 System Windows Input Touch FrameReported 事件 该事件是开发人员可用的最原始且响应速度最快的触摸事件 您可以像这样使用该事件 public Main
  • 使用 Silverlight 在运行时在 tabcontrol 中添加 TabItem

    嗨朋友们 我是 silverlight 应用程序的新手 我创建了带有 4 个 tabitem 的 tabcontrol tabitem 的名称类似于 tab1 tab2 tab3 tab4 我需要在运行项目中添加一个选项 通过以下代码添加成
  • Silverlight:创建圆形按钮模板

    我决定尝试制作一个圆形按钮 因此使用表达式混合 我在 xaml 上放置了一个按钮控件 然后 我通过选择 编辑控制部件 模板 gt 编辑副本 来创建一个模板 我正在尝试设计它 使按钮的左侧和右侧始终是完美的半圆 这样无论按钮长得多高或多宽 角
  • 如何在 UITabBarController 中显示 ViewController?

    我有一个 UITabBarController 所有其他视图控制器都连接到它 现在我想将我的控制器显示为 let storyboard UIStoryboard name Main bundle nil let vc ViewControl
  • StorageFile比IsolatedStorageFile慢50倍

    当我发现在 Lumia 920 上运行的应用程序的 WP7 版本加载数据的速度是在同一设备上运行的 WP8 版本的 2 倍时 我正在对多种算法进行基准测试 以找到加载应用程序中所有数据的最快方法 然后 我编写了以下独立代码来测试 WP8 中
  • Silverlight 默认 ContentPresenter 内容

    为什么这不起作用 In 通用 xaml对于自定义控件 在应用于自定义控件的样式中
  • ToggleButton 控件 VisualStateManager:处理多个悬停状态

    参考我之前的问题 Silverlight MVVM 困惑 基于状态更新图像 https stackoverflow com questions 5034189 silverlight mvvm confusion updating imag
  • 将静态类的字符串变量数据绑定到 Phone 7 中的 textBlock?

    这是 C 代码 public static class Global public static string Temp get return temp set temp value public static string temp 10
  • 从 JavaScript 字符串保存文件而不访问服务器

    如果我在 JavaScript 中有一个内存字符串 例如 Excel 或 PDF 格式 并且我想弹出一个保存对话框以便用户可以将这些字节保存到文件中 我将如何执行此操作 我试图避免回到服务器 如果我要返回服务器 我可以在响应中发送正确的 H
  • Silverlight Web 服务“远程服务器返回错误:NotFound”

    我有一个 Silverlight 应用程序 它检索可序列化类的列表 在这些类中还有其他可序列化的类 其中一些也在列表中 问题是一切工作正常 直到我填充可序列化类列表之一 导致 silverlight 应用程序抛出异常 远程服务器返回错误 N
  • Silverlight xaml TextBlock.Text 与 CDATA 在运行时未显示?

    以下 xaml 会生成文本 激活左侧测试 在运行时和设计时可见 在 Vs2010 中
  • @IBDesignable 错误:IB Designables:无法更新自动布局状态:Interface Builder Cocoa Touch Tool 崩溃

    我有一个非常简单的 UITextView 子类 它添加了 占位符 功能 您可以在文本字段对象中找到该功能 这是我的子类代码 import UIKit import Foundation IBDesignable class Placehol
  • 新的 Windows 应用程序 - 什么语言?

    我们目前正处于开发 Windows 桌面应用程序的前期阶段 但当听到有关 Windows 8 Silverlight WPF Jupiter 的所有最新讨论时 我不知道该相信什么了 现在用WPF启动一个新项目是不是有问题 我应该切换到 Si

随机推荐

  • 是否有可能使用 XQuery 生成随机数? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我必须使用 XQuery 生成一系列
  • require_once 中的相对路径不起作用

    我有以下结构 otsg gt class gt authentication php gt database php gt user php gt include gt config inc php gt encryption php gt
  • DLLImport C++ 函数,以 char* 作为输入或输出参数

    我有两个想要 DllImport 的 C 函数 bool SendString const char pSendStr long strSize bool ReadString char pReadStr long readStrSize
  • JQuery .submit() 在 IE9 中失败

    下面是一个 Jsfiddle 和最近提出的问题的链接 如果您在 FF 或 Chrome 中进入 jsfiddle 页面并单击 Click Me 您可以选择一个文件 一旦确定该文件 页面将查找 php 脚本 在 IE 中 它不会查找 php
  • TOAuth2Authenticator:如何刷新过期的令牌?

    我一定是错过了什么 我一直在尝试使用新的 对我来说是新的 来自delphi xe2环境 TOAuth2Authenticator TRESTClient TRESTRequest TRESTResponse组件来刷新过期的OAUTH2令牌
  • junit-vintage-engine 和 junit-jupiter-engine 之间的区别?

    这是一个双重问题 有什么区别junit vintage engine and junit jupiter engine Spring Boot 入门项目排除了junit vintage engine 是强制使用junit jupiter e
  • SpringBoot - 无法解析@RunWith - 找不到符号

    Spring Boot 项目 在 build gradle 中 dependencies implementation com google code gson gson 2 7 implementation com h2database
  • gulp-sass 可以解决 load_path 支持吗?

    问题 我正在使用 gulp sass 并想定义一个 load path 这样我就不必有很长的 import 规则 voor Bower 依赖项 例如 import normalize 代替 import bower components b
  • .net/C# 的 Html 解析器和对象模型

    我希望使用 net 来解析 html 以测试或断言其内容 IE HtmlDocument doc GetDocument 一些 html 列表表单 doc Forms 链接 link doc GetLinkByText 新客户 这个想法是允
  • 如何将一个目录中的所有文件移动到多个具有给定文件数量的目录中?

    我有一个包含超过 27000 张图像的目录 我想将这些文件分成文件夹 每个文件夹包含大约 500 张图像 它们如何排序并不重要 我只是想将它们分开 一个 简单 的 find xargs 就可以了 find maxdepth 1 type f
  • 关于 GK 成就的完成百分比

    经过测试 我发现GKAchievement的percentComplete类型虽然是double 但在苹果的帮助文档中合法值是在0 0到100 0之间 但是如果你向苹果服务器报告percentComplete 1 5 下次你将得到值perc
  • Visual Studio 编辑器边距中的蓝线

    使用 Visual Studio 时 我在页边空白处看到这些蓝线 我知道黄线和绿线表示编辑 但在蓝线上找不到任何内容 有谁知道他们的意思吗 Visual Studio 使用三种颜色来跟踪变化 yellow 保存前进行更改 green 保存后
  • Windows 7 SDK安装失败

    我好像完全无法安装Windows 7 SDK http en wikipedia org wiki Microsoft Windows SDK到我的机器上 我在网上找到的唯一解决方案是进行一系列注册表更改 我已经这样做了 仍然没有成功 这是
  • 部分类继承

    我正在为 Windows Phone 制作一个单位转换器 但我在类继承方面遇到了一些问题 我有课Measurement这应该是我的程序中图形内容的顶级 public class Measurement PhoneApplicationPag
  • matplotlib:Humor Sans 无法正确显示重音

    如果我选择 Humor Sans 这就是我从 matplotlib 得到的结果 因此 DIST NCIA 显示为 DIST NCIA 与其他字体一起显示效果很好 代码在这里 coding utf 8 from matplotlib impo
  • 序列化 - 如何保护序列化的 JAVA 对象?

    如果通过网络发送序列化对象 如何保护序列化对象的安全 我怀疑黑客可能会中断 破解我的数据 谁能详细讲述如何实现这一点 本演示介绍了攻击者如何有效地篡改 Java 序列化流 https www owasp org images e eb OW
  • Numpy 逐元素点积

    有没有一种优雅的 numpy 的方法来按元素应用点积 或者如何将下面的代码翻译成更好的版本 m0 shape 5 3 2 2 m1 shape 5 2 2 r np empty 5 3 2 2 for i in range 5 for j
  • 检查注释是否属于特定类型

    我正在使用反射来查看附加到类属性的注释是否属于特定类型 目前我正在做的 if javax validation Valid equals annotation annotationType getName 这让我觉得有点麻烦 因为它依赖于一
  • 为什么通过UdpClient发送会导致后续接收失败?

    我正在尝试创建一个 UDP 服务器 它可以向所有向其发送消息的客户端发送消息 真实情况要复杂一些 但最简单的方法是将其想象为一个聊天服务器 之前发送过消息的每个人都会收到其他客户端发送的所有消息 所有这一切都是通过UdpClient 在单独
  • LongListSelector 内的缓慢故事板动画

    我有一个 LongListSelector 其中填充了一些项目 每个项目都有一个子菜单 可以使用滑动动画显示或折叠该子菜单 问题是动画非常慢 具体取决于您在列表中点击的项目 开始和结束的时候很慢 中间很顺利 我怀疑每个动画帧都会使长列表选择