模拟 Windows 8 开始菜单平铺布局引擎

2024-04-20

那么有人知道完美模拟 Windows 8 开始菜单平铺布局引擎的示例代码或控件吗?

它应该支持混合的方形和矩形瓷砖,并正确地将方形瓷砖重新包装在矩形瓷砖上方或下方。

注意:如果所有瓷砖都是正方形,WrapPanel 就可以工作。但是,一旦您混合了跨越 2 格空间的图块,布局就会中断,并且与 Windows 8 开始菜单不一致

我期待扩展 WPF 面板的代码。


免责声明:是的,我已经在互联网上搜索过,我发现的最接近的是 CodeProject 示例,但只有当所有图块都是相同大小的正方形时才有效。


我环顾四周,找不到任何可以做我/我们想做的事情。我知道要获得这种行为,我们需要某种自定义面板对象,所以我开始创建一个......

归根结底,瓷砖需要垂直排列,双宽度瓷砖占据该列中的一整行,正常宽度瓷砖要配对。当它到达容器底部时,它需要创建一个新列并遵循相同的模式。

这是我的实现:

    public class MetroTilePanel : Panel
{
    protected override Size ArrangeOverride(System.Windows.Size finalSize)
    {
        double x = 0, y = 0, colWidth = 0, rowHeight = 0;
        int col = 0;
        colWidth = Children.Cast<UIElement>().Select(c => c.DesiredSize.Width).Max();

        foreach (UIElement child in Children)
        {
            rowHeight = Math.Max(rowHeight, child.DesiredSize.Height);

            if (x + child.DesiredSize.Width > (colWidth * (col + 1)))
            {
                // New row
                y += rowHeight;
                x = (colWidth * (col));
                rowHeight = child.DesiredSize.Height;
            }

            if (y + rowHeight > finalSize.Height)
            {
                // New column
                col++;
                x = (colWidth * (col));
                y = 0;
            }

            child.Arrange(new Rect(x, y, child.DesiredSize.Width, child.DesiredSize.Height));
            x += child.DesiredSize.Width;
        }
        return finalSize;
    }

    protected override Size MeasureOverride(Size availableSize)
    {
        double x = 0, y = 0, colWidth = 0;

        foreach (UIElement child in Children)
        {
            child.Measure(availableSize);

            if (x + child.DesiredSize.Height > availableSize.Height)
            {
                x += colWidth;
                y = 0;
                colWidth = 0;
            }

            y += child.DesiredSize.Height;
            if (child.DesiredSize.Width > colWidth)
            {
                colWidth = child.DesiredSize.Width;
            }
        }
        x += colWidth;

        var resultSize = new Size();

        resultSize.Width = double.IsPositiveInfinity(availableSize.Width) ? x : availableSize.Width;
        resultSize.Height = double.IsPositiveInfinity(availableSize.Height) ? y : availableSize.Height;

        return resultSize;
    }
}

Screenshot of the control in action: enter image description here

免责声明:

  • MeasureOverride 只是偶然起作用,并且设置不正确。
  • 如果您想要漂亮的 MetroTile 布局,请坚持使用统一尺寸,即 100x100 和 200x100
  • 我还没有完全测试它,但我将把它实现到我的假地铁应用程序中,所以如果你想看到任何未来的变化,只是喊叫。
  • 如果您想要正确的 GridView 平铺行为,那么我们必须创建一个全新的控件(以支持拖动项目等)。

我希望这有帮助。

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

模拟 Windows 8 开始菜单平铺布局引擎 的相关文章

  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif

随机推荐

  • 如何使用 rvest R 从谷歌新闻中获取头条新闻?

    我想使用 R 中的 rvest 从谷歌新闻中获取头条新闻 到目前为止我已经做到了这一点 library rvest url read html https www google com search hl en tbm nws authus
  • 根据其他字段 javax.validation 的条件进行选项的字段验证

    如果存在另一个字段 我需要执行字段验证 它可以是值之一 import javax validation class Person NotBlank private String name private Long groupId Valid
  • Windows 在 PATH 中搜索可执行文件的相对顺序是什么?

    如果我有a com a cmd a bat and a exe我的文件中的 PATH 如果我只调用该命令 Windows 会选择哪一个a 这是微软官方指定的吗 我只是想包裹我的gvim exe可执行文件 n 但是我的gvim bat似乎既不
  • Elasticsearch 过滤器/计算嵌套字段

    我有带有嵌套字段的文档 如下所示 results id 1234 name asdf id 5678 name jkl ip 1 2 3 4 嵌套字段的映射如下所示 results type nested properties id typ
  • PDO 最后插入 ID 总是正确的吗?

    我有以下代码 我想问的是这个 想象一下 当两个人同时加载页面时 是否存在其他人的查询在检索到最后一个 ID 之前插入 从而混淆 ID 的危险 不 这种情况是不可能的 方法 db gt lastInsertId 返回此数据库连接的最后插入的
  • 将一个 XML 包含在另一个 XML 中并使用 python 解析它

    我想将一个 XML 文件包含在另一个 XML 文件中并用 python 解析它 我正在尝试通过 Xinclude 来实现它 有一个 file1 xml 看起来像
  • 捕获 Exception 对象是否安全

    我使用依赖于异常的 Java 库 简化代码如下 try val eventTime eventTimeString as Date catch case e Exception gt logger error s Can t parse e
  • pandas,根据某些列值和 NAN 组合行

    所以我有一个 pandas 数据框 如下所示 id 1 id 2 value1 value2 1 2 100 NAN 1 2 NAN 101 10 20 200 NAN 10 20 NAN 202 10 2 345 345 我想要一个像这样
  • 比较 YUI 和 Ext JS [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何收到 SalesForce 中新潜在客户的通知? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望在 Salesforce 中创建新潜在客户时收到通知 Salesforce 中是否有类似 web
  • 自动将 Google 表格中单元格内容大写的脚本?

    我有一个电子表格 可以输入股票代码 我希望它们始终全部大写 无论它们如何输入 这似乎需要一些脚本 因为除非存在该列的第二个副本 否则无法使用函数来执行此操作 这是不可接受的 我有一个有效的解决方案 但有一个关键问题 代码如下 functio
  • ASP.NET (MVC) 提供图像

    我正在创建一个 MVC 3 应用程序 尽管同样适用于其他技术 例如 ASP NET Forms 并且只是想知道从代码提供图像而不是使用直接虚拟路径 像往常一样 是否可行 性能方面 我的想法是改进提供文件的通用方法 应用安全检查 基于路由值的
  • 将特定位置的安全号码更改为 X

    我是新来的 将数字替换为特定位置的某些字符 我有这组号码 123 45 6789 但我只需要显示这样的 XXX XX 6789 但我只需要更改不包括 破折号 的数字 下面是我的示例代码 var mainStr view ssn text v
  • 如何获取计算样式以及该规则的来源? [复制]

    这个问题在这里已经有答案了 我想获取元素计算样式和应用该规则的 css 文件和行 类似于 Chrome 开发工具在使用 计算 选项卡并单击值旁边的箭头时所做的操作 简而言之 我希望能够使用 javascript 找出这两件事 实际应用于该元
  • 为什么网络开发人员仍然使用元关键字和元描述标签?

    谷歌根本不使用元关键字标签因为关键字主要用于垃圾邮件搜索引擎 Google 不使用元描述标签进行排名 有时 如果部分内容不适合 元描述标签会用于搜索结果中的网站片段 但大多数元描述是根据页面内容自动生成的 并且元描述与页面内容的开头相同 谷
  • 为什么这个函数被应用于一个没有作为参数调用的变量?

    我尝试编写的一些代码遇到了问题 我正在尝试获取坐标列表列表 表示 3D 中形状的可能位置 并形成一个列表 其中包含原始列表中的所有元素以及原始列表中旋转的元素 以便 x y z 坐标也被移动以包括 z x y 和 y z x 我认为用一个例
  • 有没有撤消 git flow init 的命令?

    After git flow init 如何去掉git flow模型 如何从中删除所有相关配置 git config file git flow init force reset git flow init f 如何从以下内容中删除 git
  • PHP使用RSA私钥解密数据

    我有一个程序 使用 C rsa 公钥加密密码 输出字节数组 为了让我轻松传输它并维护数据 我将字节直接转换为十六进制字符串 现在这就是我遇到问题的地方 我将发布数据发送到我的脚本 现在不确定将其转换为什么以及如何解密它 我正在尝试使用htt
  • 在 CKEditor 4.x 中,有没有办法在初始化后获取允许的标签列表?

    有没有办法获取 CKEditor 4 x 准确地说是 4 4 7 中所有允许标签的列表after编辑器已使用所有插件进行初始化 并且所有allowedContentRules and disallowedContentRules或已应用任何
  • 模拟 Windows 8 开始菜单平铺布局引擎

    那么有人知道完美模拟 Windows 8 开始菜单平铺布局引擎的示例代码或控件吗 它应该支持混合的方形和矩形瓷砖 并正确地将方形瓷砖重新包装在矩形瓷砖上方或下方 注意 如果所有瓷砖都是正方形 WrapPanel 就可以工作 但是 一旦您混合