UWP中实现大爆炸效果(一)

简介: 原文:UWP中实现大爆炸效果(一)自从老罗搞出大爆炸之后,各家安卓都内置了类似功能。UWP怎么能落下呢,在这里我们就一起撸一个简单的大爆炸实现。 闲话不说,先上效果: 因为代码太多,所以我打算写成一个系列,下面是第一篇的正文:   首先,我们构思一下BigbangView需要哪些部分: 1、一个能多选的控件; 2、一个能给Item布局的面板; 3、选中之后出现的Header和Footer。
原文: UWP中实现大爆炸效果(一)

自从老罗搞出大爆炸之后,各家安卓都内置了类似功能。UWP怎么能落下呢,在这里我们就一起撸一个简单的大爆炸实现。

闲话不说,先上效果:

因为代码太多,所以我打算写成一个系列,下面是第一篇的正文:

 

首先,我们构思一下BigbangView需要哪些部分:

1、一个能多选的控件;

2、一个能给Item布局的面板;

3、选中之后出现的Header和Footer。

这里我们先来实现第二项,BigbangPanel。

BigbangPanel继承自Panel,重载MeasureOverride和ArrangeOverride方法。

MeasureOverride实现调用此方法以形成递归布局更新;

ArrangeOverride为其子元素实现自定义布局的父对象应从其布局重写实现调用此方法以形成递归布局更新。

我们对面板子元素布局的思路是,遍历子元素,从左到右依次排列,若当前行子元素总宽度超过Panel宽度,则换一行从头继续排列。

(在此我们只实现一个简单版,不考虑子元素的VerticalAlignment)

protected override Size MeasureOverride(Size availableSize)
{
    foreach (var child in Children)
    {
        child.Measure(availableSize);
    }

    double width = 0d, height = 0d;
    double col_width = 0d, row_height = 0d;
    int end_row_count = -1;

    for (int i = 0; i < Children.Count; i++)
    {
        if (Children[i].DesiredSize.Width + col_width > availableSize.Width)
        {
            end_row_count = i;
            height += row_height;
            width = Math.Max(width, col_width);
            col_width = 0;
            row_height = 0;
        }
        col_width += Children[i].DesiredSize.Width;
        row_height = Math.Max(row_height, Children[i].DesiredSize.Height);
    }

    //计算最后一行
    if (end_row_count != -1)
    {
        col_width = 0;
        row_height = 0;
        for (int i = end_row_count; i < Children.Count; i++)
        {
            row_height = Math.Max(row_height, Children[i].DesiredSize.Height);
            col_width += Children[i].DesiredSize.Width;
        }
        height += row_height;
        width = Math.Max(width, col_width);
    }

    return new Size(width, height);
}

  

protected override Size ArrangeOverride(Size finalSize)
{
    double x = 0d, y = 0d;
    double items_height = 0d;
    int end_count = -1;
    int row_start_index = 0;

    for (int i = 0; i < Children.Count; i++)
    {
        if (Children[i].DesiredSize.Width + x > finalSize.Width)
        {
            x = 0;
            y += items_height;

            items_height = 0;
            end_count = i;
            row_start_index = i;
        }
        Children[i].Arrange(new Rect(x, y, Children[i].DesiredSize.Width, Children[i].DesiredSize.Height));
        x += Children[i].DesiredSize.Width;
        items_height = Math.Max(items_height, Children[i].DesiredSize.Height);
    }
    return finalSize;
}

  

现在可以测试一下,新建一个页面,添加一个ListView,修改ListView的ItemsPanel

<ListView.ItemsPanel>
    <ItemsPanelTemplate>
        <control:BigbangPanel >
            <control:BigbangPanel.ChildrenTransitions>
                <TransitionCollection>
                <AddDeleteThemeTransition />
                </TransitionCollection>
            </control:BigbangPanel.ChildrenTransitions>
        </control:BigbangPanel>
    </ItemsPanelTemplate>
</ListView.ItemsPanel>
View Code

后台代码:

public sealed partial class BigbangPage : Page
{
    public BigbangPage()
    {
        this.InitializeComponent();
        for(int i = 0; i < 50; i++)
        {
            list.Add(rnd.Next(100000).ToString());
        }
    }

    public static Random rnd = new Random();
    ObservableCollection<string> list { get; set; } = new ObservableCollection<string>();
}

  

然后设置ListView的ItemSource="{x:Bind list}",然后我懒得新建个项目截图了,大佬们自行测试一下吧。

下集预告:实现可以选中的BigbangView

 

目录
相关文章
|
应用服务中间件 Linux nginx
Nginx学习(二):反向代理案例
这个案例期望实现的效果:打开浏览器,在地址栏输入www.123.com,跳转到linux系统Tomcat主页面中。
260 0
Nginx学习(二):反向代理案例
|
Docker 容器
docker删除镜像
docker删除镜像
135 0
罗马数字与阿拉伯数字相互转换
罗马数字规则简明 1. 罗马单个数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)2.一个罗马数字重复几次,就表示这个数的几倍。但同一数码不能出现三次以上。
847 0
|
7天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1172 3
|
6天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
858 12
|
16天前
|
人工智能 运维 安全
|
5天前
|
机器学习/深度学习 物联网
Wan2.2再次开源数字人:Animate-14B!一键实现电影角色替换和动作驱动
今天,通义万相的视频生成模型又又又开源了!Wan2.2系列模型家族新增数字人成员Wan2.2-Animate-14B。
452 10
|
7天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
329 0