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 内的缓慢故事板动画 的相关文章

随机推荐

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