首页 > 解决方案 > 有没有人可以通过一个语句将多个孩子添加到 Xamarin 网格?

问题描述

我为 Xamarin 找到了这个 Grid 扩展:

    public static void AddChild(this Grid grid, View view, int row = 0, int column = 0, int rowspan = 1, int colspan = 1)
    {
        if (row < 0)
            throw new ArgumentOutOfRangeException("row");
        if (column < 0)
            throw new ArgumentOutOfRangeException("column");
        if (rowspan <= 0)
            throw new ArgumentOutOfRangeException("rowspan");
        if (colspan <= 0)
            throw new ArgumentOutOfRangeException("colspan");
        if (view == null)
            throw new ArgumentNullException("view");
        Grid.SetRow((BindableObject)view, row);
        Grid.SetRowSpan((BindableObject)view, rowspan);
        Grid.SetColumn((BindableObject)view, column);
        Grid.SetColumnSpan((BindableObject)view, colspan);
        grid.Children.Add(view);
    }

我这样使用它:

    this.AddChild(gridIconFrame, 0, 0);
    this.AddChild(textLabel, 0, 1);
    this.AddChild(valueLabel, 0, 2);
    this.AddChild(arrowFrame, 0, 3);

我想做的是有另一个扩展,它具有使我能够编写代码的功能:

    this.AddChildren((gridIconFrame, 0, 0),
                     (textLabel, 0, 1),
                     (valueLabel, 0, 2),
                     (arrowFrame, 0, 3));

谁能指出我正确的方向,并就如何通过另一个扩展来实现上面的代码给我一些建议?

标签: c#xamarinxamarin.forms

解决方案


根据 Jason 建议使用params关键字的评论,这与您想要的语法一样接近:

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            var grid = new object();

            AddChildren(grid,
                D(new View(), 1, 1),
                D(new View(), 1, 2));


            static Item D(View view0, int row0, int column0)
            {
                return new Item(view0, row0, column0);
            }

            static void AddChildren(object grid, params Item[] items)
            {
                // loop to add items to grid.
                foreach (Item item in items)
                {
                    Console.WriteLine("add an item");
                }
            }
        }
    }

    class Item
    {
        public View view { get; set; }
        public int row { get; set; }
        public int column { get; set; }

        public Item(View view0, int row0, int column0)
        {
            view = view0;
            row = row0;
            column = column0;
        }
    }

    class View
    {

    }
}

我没有找到任何方法来完全避免 C# 的严格语法;我的解决方法是:

  • 创建一个保存参数的类Item;
  • 创建一个名称很短的方法D,并调用该方法来构造每个项目。

您可以轻松地将“AddChildren”更改为 Gid 的扩展方法。但是您仍然需要D(..)将每组参数转换为 AddChildren 的 Item。

(我做了grid一个object,所以我可以很容易地写这个例子。把它改成Grid类。)


推荐阅读