在 Windows 表单中动态生成 windows 10ish tile-menu

dynamically generate a windows 10ish tile-menue in Windows Forms

有没有人知道生成图块的好方法,动态按组排序?

类似于 windows 10 中的磁贴视图(或者在本例中为 devexpress 示例)

目标是通过如下方式以编程方式添加组或图块:list.add("groupname","tilename")。所以组名将是组的主键和磁贴的外键。

如果您不能使用 DevExpress 控件并且不想创建自己的自定义绘制控件(我会推荐),您可以尝试使用堆叠的 FlowLayoutPanels:

将顶级 FlowLayoutPanel 放在窗体上并将其 FlowDirection 设置为 LeftToRight(蓝色的)。

对于您想要的每个组,添加一个带有 FlowDirection.TopDown(绿色的)的子 FlowLayoutPanel。

所以绿色的是你的组,你想要的图块是每个组内的控件(红色方块)。

请注意,这只是使用默认 WinForms 机制实现该行为的想法。我认为这不会很好地扩展使用的许多控件。

这是我创建的一个简单示例,可帮助您开始使用模型部分。

假设您有一个 Tile class 代表您的瓷砖。在那种情况下,我直接将组名称作为磁贴的一部分,但您也可以使用 Group class 并将 GroupId 存储在磁贴中。

public class Tile
{
    public string Title { get; set; }
    public string Group { get; set; }
}

现在,假设您已经像这样创建了几个图块:

 var tiles = new Tile[] {
     new Tile { Title = "Tile 1", Group = "Group 1" },
     new Tile { Title = "Tile 2", Group = "Group 1" },
     new Tile { Title = "Tile 3", Group = "Group 1" },
     new Tile { Title = "Tile 4", Group = "Group 2" },
     new Tile { Title = "Tile 5", Group = "Group 2" },
     new Tile { Title = "Tile 6", Group = "Group 2" }};

现在,您可以使用简单的 Linq 查询按 Group 参数对图块进行分组:

var groupedTiles = 
    from t in tiles
    group t by t.Group into g
    select new { Group = g.Key, Tiles = g.ToList() };

groupTiles 将包含 "groups" 的列表,每个列表都包含附加的图块列表。您应该能够轻松地将其绑定到您的视图。

这是一个控制台输出:

foreach (var group in groupedTiles)
{
    Console.Out.WriteLine(group.Group);

    foreach (var tile in group.Tiles)
    {
        Console.Out.WriteLine("\t" + tile.Title);
    }
}

希望这对您有所帮助。