第十七章:掌握网格(二)

简介:

代码中的网格
也可以完全用代码定义网格,但通常没有XAML定义的清晰度或有序性。 GridCodeDemo程序通过再现SimpleGridDemo的布局来演示代码方法。
要指定RowDefinition的高度和ColumnDefinition的宽度,可以使用GridLength结构的值,通常与GridUnitType枚举结合使用。 GridCodeDemoPage类顶部的行定义演示了GridLength的变体。 不包括列定义,因为它们与默认生成的列定义相同:

public class GridCodeDemoPage : ContentPage
{
    public GridCodeDemoPage()
    {
        Grid grid = new Grid
        {
            RowDefinitions = 
            {
                new RowDefinition { Height = GridLength.Auto },
                new RowDefinition { Height = new GridLength(100) },
                new RowDefinition { Height = new GridLength(2, GridUnitType.Star) },
                new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }
            }
        };
        // First Label (row 0 and column 0).
        grid.Children.Add(new Label
        {
            Text = "Grid Demo",
            FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)),
            HorizontalOptions = LayoutOptions.End
        });
        // Second Label.
        grid.Children.Add(new Label
            {
                Text = "Demo the Grid",
                FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label)),
                HorizontalOptions = LayoutOptions.End,
                VerticalOptions = LayoutOptions.End
            }, 
            1, // left
            0); // top
        // Image element.
        grid.Children.Add(new Image
            {
                BackgroundColor = Color.Gray,
                Source = Device.OnPlatform("Icon-60.png",
                                           "icon.png",
                                           "Assets/StoreLogo.png")
            },
            0, // left
            2, // right
            1, // top
            2); // bottom
        // Three BoxView elements.
        BoxView boxView1 = new BoxView { Color = Color.Green };
        Grid.SetRow(boxView1, 2);
        Grid.SetColumn(boxView1, 0);
        grid.Children.Add(boxView1);
        BoxView boxView2 = new BoxView { Color = Color.Red };
        Grid.SetRow(boxView2, 2);
        Grid.SetColumn(boxView2, 1);
        Grid.SetRowSpan(boxView2, 2);
        grid.Children.Add(boxView2);
        BoxView boxView3 = new BoxView
        { 
            Color = Color.Blue, 
            Opacity = 0.5
        };
        Grid.SetRow(boxView3, 3);
        Grid.SetColumn(boxView3, 0);
        Grid.SetColumnSpan(boxView3, 2);
        grid.Children.Add(boxView3);
        Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, 0);
        Content = grid;
    }
}

该程序显示了几种不同的方式将子项添加到网格并指定它们所在的单元格。 第一个Label位于第0行和第0列,因此只需将其添加到Grid的Children集合中以获取默认的行和列设置:

grid.Children.Add(new Label
{
   __
});

Grid重新定义其Children集合为IGridList 类型,其中包含几个额外的Add方法。 其中一种Add方法允许您指定行和列:

grid.Children.Add(new Label
    {
        __
    }, 
    1, // left
    0); // top

正如注释所示,参数实际上被命名为left和top而不是column和row。 当您看到指定行和列跨度的语法时,这些名称更有意义:

grid.Children.Add(new Image
    {
        __
    },
    0, // left
    2, // right
    1, // top
    2); // bottom

这意味着子元素在左边开始但在右边之前结束 - 换句话说,第0列和第1列。它占据从顶部开始但在底部之前结束的行,即第1行。右边的参数必须 总是大于左,底部参数必须大于顶部。 如果没有,Grid会抛出ArgumentOutOfRangeException。
IGridList 接口还定义了AddHorizontal和AddVertical方法,以将子项添加到单行或单列Grid。 在进行这些调用时,Grid会按列或行进行扩展,以及在子项上自动分配Grid.Column或Grid.Row设置。 您将在下一部分中看到此工具的用途。
在代码中将子项添加到Grid时,也可以显式调用Grid.SetRow,Grid.SetColumn,Grid.SetRowSpan和Grid.SetColumnSpan。 在将子项添加到Grid的Children集合之前或之后是否进行这些调用并不重要:

BoxView boxView1 = new BoxView { … };
Grid.SetRow(boxView1, 2);
Grid.SetColumn(boxView1, 0);
grid.Children.Add(boxView1);
BoxView boxView2 = new BoxView { … };
Grid.SetRow(boxView2, 2);
Grid.SetColumn(boxView2, 1);
Grid.SetRowSpan(boxView2, 2);
grid.Children.Add(boxView2);
BoxView boxView3 = new BoxView
{ 
    __
};
Grid.SetRow(boxView3, 3);
Grid.SetColumn(boxView3, 0);
Grid.SetColumnSpan(boxView3, 2);
grid.Children.Add(boxView3);
目录
相关文章
|
1月前
|
JavaScript 前端开发 API
10 个纤细的数据网格:为您的项目选择合适的数据网格
10 个纤细的数据网格:为您的项目选择合适的数据网格
24 0
|
5月前
|
数据可视化 SDN Python
复动力系统 | 混沌 | Lozi 映射吸引子的可视化与交互式探索
该文介绍了一篇关于Lozi映射吸引子可视化和交互式探索的文章。Lozi映射是混沌理论中的一个模型,展示非线性动力系统的复杂性。通过Python和matplotlib,作者实现了Lozi映射的可视化,并添加交互功能,允许用户缩放以详细观察混沌吸引子。文中还给出了Lozi映射的数学定义,并提供了Python代码示例,演示如何绘制和动态调整吸引子的显示。
|
4月前
|
Shell vr&ar 图形学
数学库,3D建模库,设计之图形化设计方案公式,3D建模库,圆柱体,圆的计算方式,三角形的计算方式
数学库,3D建模库,设计之图形化设计方案公式,3D建模库,圆柱体,圆的计算方式,三角形的计算方式
技术好文共享:辅助角公式的几何意义
技术好文共享:辅助角公式的几何意义
技术分享 | ANSYS高级几何处理与网格应用技巧
Space Claim、排油烟机几何处理、流体域抽取;ANSYS Meshing、实际案例网格划分
技术分享 | ANSYS高级几何处理与网格应用技巧
|
架构师 数据管理 数据挖掘
【数据网格】数据网格 101:入门所需的一切
【数据网格】数据网格 101:入门所需的一切
|
人工智能 Kubernetes 监控
谈谈我对服务网格的理解
服务网格作为一种用来管理应用服务通信的基础核心技术,为应用服务间的调用带来了安全、可靠、快速、应用无感知的流量路由、安全、可观测能力。
谈谈我对服务网格的理解
|
Android开发
第二十一章:变换(十四)
3D-ish旋转 即使计算机屏幕是平面和二维的,也可以在这些屏幕上绘制视觉对象,使其具有第三维的外观。 在本章的前面,您看到了一些文本效果,它们提供了第三个维度的提示,而Xamarin.Forms支持两个额外的旋转,名为RotationX和RotationY,它们似乎也突破了屏幕固有的二维平面度。
1389 0
|
JavaScript Android开发 索引
第二十一章:变换(十二)
这两个问题都在非最小的BoxViewClock中得到解决。 XAML文件与MinimalBoxViewClock非常相似,但代码隐藏文件更为广泛。 它以名为HandParams的小结构开始,该结构定义每只手相对于半径的大小,但也包括偏移值。
1082 0
|
JavaScript Android开发
第二十一章:变换(十一)
模拟时钟用于图形用户界面的经典示例程序之一是模拟时钟。 BoxView再一次为时钟之手进行救援。 必须根据当前时间的小时,分钟和秒旋转这些BoxView元素。让我们首先使用名为AnalogClockViewModel的类来处理旋转数学,该类包含在Xamarin.
1094 0