WinRT中ListView的项目插入动画

2024-03-17

最近,我开始构建自己的大型 Windows 8 应用商店应用程序。 在 UI 方面,我开始复制一些好的 UI。

我遇到了一个非常有趣的动画,即在标准邮件应用程序的列表视图中插入新元素。当您单击链时,它会展开并显示链中的所有消息。

Here http://www.youtube.com/watch?v=gwnp7E9OBhY是捕获的视频。

我不知道他们使用什么技术来实现这个动画和行为。

任何人都可以帮助我,解释或举例说明我如何实现这种行为?谢谢。


邮件应用程序是用 JavaScript 编写的,因此了解它是如何完成的不会对您有太大帮助,因为此 UI 堆栈与 XAML 堆栈完全不同。但问题是列表控件可能以相同的方式进行动画处理,因此您只需添加/删除列表中的某些项目即可获得展开/折叠效果。

我玩了一下,这就是我想出的方法,它使用 ListView ItemTemplateSelector 属性来定义一些不同的项目模板。

<Page
    x:Class="App82.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App82"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Page.Resources>
        <local:CollapsibleListItemTemplateSelector
            x:Key="collapsibleListItemTemplateSelector">
            <local:CollapsibleListItemTemplateSelector.BasicItemTemplate>
                <DataTemplate>
                    <Border
                        Margin="5"
                        Height="50"
                        VerticalAlignment="Stretch"
                        BorderBrush="ForestGreen"
                        BorderThickness="2,0,0,0">
                        <StackPanel
                            Margin="10,0,0,0">
                            <TextBlock
                                FontWeight="Bold"
                                Text="{Binding Title}" />
                            <TextBlock
                                Text="{Binding Gist}" />
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </local:CollapsibleListItemTemplateSelector.BasicItemTemplate>
            <local:CollapsibleListItemTemplateSelector.ExpandedItemTemplate>
                <DataTemplate>
                    <Border
                        Margin="15,5,5,5"
                        Height="50"
                        VerticalAlignment="Stretch"
                        BorderBrush="Yellow"
                        BorderThickness="2,0,0,0">
                        <StackPanel
                            Margin="10,0,0,0">
                            <TextBlock
                                FontWeight="Bold"
                                Text="{Binding Title}" />
                            <TextBlock
                                Text="{Binding Gist}" />
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </local:CollapsibleListItemTemplateSelector.ExpandedItemTemplate>
            <local:CollapsibleListItemTemplateSelector.CollapsibleItemTemplate>
                <DataTemplate>
                    <Border
                        Margin="5"
                        Height="50"
                        VerticalAlignment="Stretch"
                        BorderBrush="DodgerBlue"
                        BorderThickness="2,0,0,0">
                        <StackPanel
                            Margin="10,0,0,0"
                            Orientation="Horizontal">
                            <TextBlock
                                FontWeight="Bold"
                                Text="{Binding ChildItems.Count}" />
                            <TextBlock
                                FontWeight="Bold"
                                Text="&#160;Items" />
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </local:CollapsibleListItemTemplateSelector.CollapsibleItemTemplate>
        </local:CollapsibleListItemTemplateSelector>
    </Page.Resources>
    <Grid
        Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <ListView
            x:Name="ListView"
            ItemTemplateSelector="{StaticResource collapsibleListItemTemplateSelector}"
            ItemClick="OnItemClick"
            IsItemClickEnabled="True" />
    </Grid>
</Page>

背后代码:

using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using App82.Common;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace App82
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();

            var items = new ObservableCollection<BindableBase>();
            var item1 = new BasicItem { Title = "Item 1", Gist = "This item has some content that is not fully shown..." };
            var item2 = new ExpandedItem { Title = "Item 2", Gist = "This item has some content that is not fully shown..." };
            var item3 = new ExpandedItem { Title = "Item 3", Gist = "This item has some content that is not fully shown..." };
            var item4 = new ExpandedItem { Title = "Item 4", Gist = "This item has some content that is not fully shown..." };
            var item5 = new BasicItem { Title = "Item 5", Gist = "This item has some content that is not fully shown..." };

            var itemGroup1 = new CollapsibleItem(items, new[] { item2, item3, item4 });
            items.Add(item1);
            items.Add(itemGroup1);
            items.Add(item5);
            this.ListView.ItemsSource = items;
        }

        private void OnItemClick(object sender, ItemClickEventArgs e)
        {
            var collapsibleItem = e.ClickedItem as CollapsibleItem;
            if (collapsibleItem != null)
                collapsibleItem.ToggleCollapse();
        }
    }

    public class CollapsibleListItemTemplateSelector : DataTemplateSelector
    {
        public DataTemplate BasicItemTemplate { get; set; }
        public DataTemplate CollapsibleItemTemplate { get; set; }
        public DataTemplate ExpandedItemTemplate { get; set; }

        protected override Windows.UI.Xaml.DataTemplate SelectTemplateCore(object item, Windows.UI.Xaml.DependencyObject container)
        {
            if (item is ExpandedItem)
                return ExpandedItemTemplate;
            if (item is BasicItem)
                return BasicItemTemplate;
            //if (item is CollapsibleItem)
                return CollapsibleItemTemplate;
        }
    }

    public class BasicItem : BindableBase
    {
        #region Title
        private string _title;
        public string Title
        {
            get { return _title; }
            set { this.SetProperty(ref _title, value); }
        }
        #endregion

        #region Gist
        private string _gist;
        public string Gist
        {
            get { return _gist; }
            set { this.SetProperty(ref _gist, value); }
        }
        #endregion
    }

    public class ExpandedItem : BasicItem
    {

    }

    public class CollapsibleItem : BindableBase
    {
        private readonly IList _hostCollection;

        #region IsExpanded
        private bool _isExpanded;
        public bool IsExpanded
        {
            get { return _isExpanded; }
            set
            {
                if (this.SetProperty(ref _isExpanded, value))
                {
                    if (_isExpanded)
                        Expand();
                    else
                        Collapse();
                }
            }
        }
        #endregion

        #region ChildItems
        private ObservableCollection<BasicItem> _childItems;
        public ObservableCollection<BasicItem> ChildItems
        {
            get { return _childItems; }
            set { this.SetProperty(ref _childItems, value); }
        }
        #endregion

        public CollapsibleItem(
            IList hostCollection,
            IEnumerable<BasicItem> childItems)
        {
            _hostCollection = hostCollection;
            _childItems = new ObservableCollection<BasicItem>(childItems);
        }

        public void ToggleCollapse()
        {
            IsExpanded = !IsExpanded;
        }

        private void Expand()
        {
            int i = _hostCollection.IndexOf(this) + 1;

            foreach (var childItem in ChildItems)
            {
                _hostCollection.Insert(i++, childItem);
            }
        }

        private void Collapse()
        {
            int i = _hostCollection.IndexOf(this) + 1;

            for (int index = 0; index < ChildItems.Count; index++)
            {
                _hostCollection.RemoveAt(i);
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WinRT中ListView的项目插入动画 的相关文章

随机推荐

  • 模拟集成测试

    如何模拟集成测试所需的众多依赖项 我使用 Mockito 进行 纯 单元测试 在这种情况下 纯粹 意味着测试单个类 模拟它的所有依赖项 美丽的 现在进行集成测试 假设在这种情况下 集成测试将测试如下内容 消息被放入队列中 消息已 处理 响应
  • 如何在 WooCommerce 中创建多个具有相同 SKU 的简单产品?

    我想在 WooCommerce 中创建多个具有相同 SKU 的简单产品 我在管理设置中搜索 但找不到任何启用此功能的设置 有没有什么钩子可以让我禁用这个功能 如果您想完全禁用 SKU 功能 那么您必须使用wc product sku ena
  • 测试飞行组 - 如何将构建发送到组?

    苹果在 TestFlight Groups 上的公告称 将您的测试人员分组以快速发送构建 提供 单独说明要关注的位置 并将操作应用于 TestFlight 中同时有多位测试人员 我该怎么做呢 我已经设置了我的组 我的版本已上传并通过了 Be
  • 不平衡学习:导入错误:无法导入名称“MultiOutputMixin”

    我已经重新安装了最新的 scikit learn 和不平衡学习 我还检查了所有其他库 以确保它们与不平衡学习兼容 我只想运行一个简单的RandomOverSample 但我收到以下导入错误消息 import imblearn from im
  • 有没有办法可以判断 SMTP 服务器是否期望客户端使用“隐式”SSL 与“显式”SSL 进行连接?

    SSL 可以是 显式 或 隐式 如以下链接所述 http help globalscape com help secureserver2 Explicit versus implicit SS htm http help globalsca
  • 子动态创建的组件与父组件之间的 Angular4 通信

    我有一个 Angular4 组件 一旦用户按下加号按钮 它就会动态创建许多子组件 子组件有一个输入选择 必须在选项选择后向父组件发送信息 子组件由 ComponentFactoryResolver 创建 如下所示 let component
  • 当 defaultRender 设置为非常基本的 ArcRendererConfig() 时,Flutter GoogleChart 饼图不会渲染

    图表按预期显示使用以下饼图小部件 class ABCPieChart extends StatefulWidget override ABCPieChartState createState gt ABCPieChartState clas
  • 在 Silverlight 应用程序中呈现 HTML 内容

    在我们的应用程序之一中 需要在 Silverlight 2 0 容器之一中显示项目符号列表 我们决定使用 HTML 标记文本来实现同样的目的 虽然 Google 上有很多可用的选项 例如覆盖 HTML div 容器等 但我想知道最可行的方法
  • 保存 python TempFile 的快速方法?

    我在用tempfile TemporaryFile进行一些中间处理 该程序在关闭时很好地为我删除了临时文件 这正是我大多数时候想要的行为 但是 有没有办法保存文件以供在发生 陷入 错误或其他异常情况时进行检查 寻找开始并使用shutil c
  • 使用 PHP 获取和存储信用卡信息的最佳实践

    我是否应该在前几个步骤 验证 审查购买 中使用会话 然后在最终提交中将信息输入到数据库中 饼干会被劫持并演变为诉讼吗 是不是风险太大了 如果存储信用卡号 我是否需要以任何特殊方式保护我的数据库 欢迎任何建议和个人经历 信用卡问题对于存储信用
  • Laravel 每个用户一次会话

    我正在尝试找出如何只允许每个用户一个会话 因此 如果有人在已经登录其用户帐户的情况下尝试登录 第一个会话将被销毁 并将被注销以仅允许当前会话 我正在关注这个 如何在 Laravel 中保持每个用户的单个会话 https anupamsaha
  • 如何在应用程序退出前执行代码 flutter

    我想检测用户何时退出我的应用程序并执行一些代码 但我不知道如何执行此操作 我尝试使用这个包 https pub dev packages flutter lifecycle state https pub dev packages flut
  • Mac Catalyst 应用程序:如何在不终止应用程序的情况下关闭窗口?

    我正在使用 Mac Catalyst 开发一个应用程序 当用户关闭 Mac 版本上的窗口时 应用程序将终止 可以通过使用以下方法来改变 Cocoa 中的这种行为 applicationShouldTerminateAfterLastWind
  • 打开一对“int”

    一些背景 我正在解析一个会计分类账 其中有account1 and account2 as int类型 每个都是 0 99999 范围内的数字 我有很多组合需要考虑 理想情况下我想使用类似的东西 switch account1 accoun
  • Rails:验证两列(一起)的唯一性

    我有一个Release模型与medium and country列 等等 不应该有releases共享相同的medium country组合 我该如何将其写为 Rails 验证 您可以使用独特性 http guides rubyonrail
  • if 语句中初始化的变量的范围是什么?

    这可能是一个简单的范围界定问题 Python 文件 模块 中的以下代码让我有点困惑 if name main x 1 print x 在我使用过的其他语言中 这段代码会抛出异常 因为x变量是局部的if语句并且不应该存在于它之外 但是这段代码
  • 仅通过 Express 框架对某些 URL 使用 HTTP 基本身份验证

    我有一个使用 Express 框架设计的 Node js 应用程序http 认证 http http auth info模块 如下 var auth require http auth var express require express
  • WPF DataBinding:取消属性更改 - 组合框未对齐

    我有一个带有组合框和文本框的 WPF 表单 两者都数据绑定到对象的属性 更改组合框或文本框输入会更新对象的属性 并且数据绑定会启动并更新 UI 问题是 我实现了一种取消更改的方法 该方法有效 但搞砸了 UI 更新 如果我从组合框进行更改并取
  • C# 中的 Google 地理编码 Json 解析问题

    我的代码运行良好 但我似乎无法到达树的更深部分 我正在尝试拉动经度和纬度 下面的代码将 status 没有问题拉为 OK 在响应的最后 geometry gt location gt lat 和 lng 的语法是什么 这是我的代码 stri
  • WinRT中ListView的项目插入动画

    最近 我开始构建自己的大型 Windows 8 应用商店应用程序 在 UI 方面 我开始复制一些好的 UI 我遇到了一个非常有趣的动画 即在标准邮件应用程序的列表视图中插入新元素 当您单击链时 它会展开并显示链中的所有消息 Here htt