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

简介:

几乎是现实生活中的网格示例

我们现在准备从第8章重写XamlKeypad程序以使用Grid。 新版本称为KeypadGrid。 Grid的使用不仅强制构成键盘的Button元素具有相同的大小,而且还允许键盘的组件跨越单元格。
组成键盘的网格以具有HorizontalOptions和VerticalOptions设置的页面为中心。 它有五行三列,但RowDefinitions和ColumnDefinitions集合不需要显式构造,因为每个单元格都有一个“*”(星形)高度和宽度。
此外,整个Grid都有一个特定于平台的WidthRequest和HeightRequest,其宽度是高度的五分之三。 (Windows Phone的差异基于用于Button的较大字体大小。)这会导致网格中的每个单元格都是正方形:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="KeypadGrid.KeypadGridPage">
    <Grid RowSpacing="2"
          ColumnSpacing="2"
          VerticalOptions="Center"
          HorizontalOptions="Center">
        <Grid.WidthRequest>
            <OnPlatform x:TypeArguments="x:Double"
                        iOS="180"
                        Android="180"
                        WinPhone="240" />
        </Grid.WidthRequest>
 
        <Grid.HeightRequest>
            <OnPlatform x:TypeArguments="x:Double"
                        iOS="300"
                        Android="300"
                        WinPhone="400" />
        </Grid.HeightRequest>
        <Grid.Resources> 
            <ResourceDictionary>
                <Style TargetType="Button">
                    <Setter Property="FontSize" Value="Large" />
                    <Setter Property="BorderWidth" Value="1" />
                </Style>
            </ResourceDictionary>
        </Grid.Resources>
        <Label x:Name="displayLabel"
               Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"
               FontSize="Large"
               LineBreakMode="HeadTruncation"
               VerticalOptions="Center"
               HorizontalTextAlignment="End" />
        <Button x:Name="backspaceButton"
                Text="&#x21E6;"
                Grid.Row="0" Grid.Column="2"
                IsEnabled="False"
                Clicked="OnBackspaceButtonClicked" />
        <Button Text="7" StyleId="7"
                Grid.Row="1" Grid.Column="0"
                Clicked="OnDigitButtonClicked" />
 
        <Button Text="8" StyleId="8"
                Grid.Row="1" Grid.Column="1"
                Clicked="OnDigitButtonClicked" />
 
        <Button Text="9" StyleId="9"
                Grid.Row="1" Grid.Column="2"
                Clicked="OnDigitButtonClicked" />
 
        <Button Text="4" StyleId="4"
                Grid.Row="2" Grid.Column="0"
                Clicked="OnDigitButtonClicked" />
 
        <Button Text="5" StyleId="5"
                Grid.Row="2" Grid.Column="1"
                Clicked="OnDigitButtonClicked" />
 
        <Button Text="6" StyleId="6"
                Grid.Row="2" Grid.Column="2"
                Clicked="OnDigitButtonClicked" />
        <Button Text="1" StyleId="1"
                Grid.Row="3" Grid.Column="0"
                Clicked="OnDigitButtonClicked" />
 
        <Button Text="2" StyleId="2"
                Grid.Row="3" Grid.Column="1"
                Clicked="OnDigitButtonClicked" />
 
        <Button Text="3" StyleId="3"
                Grid.Row="3" Grid.Column="2"
                Clicked="OnDigitButtonClicked" />
        <Button Text="0" StyleId="0"
                Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2"
                Clicked="OnDigitButtonClicked" />
        <Button Text="." StyleId="."
                Grid.Row="4" Grid.Column="2"
                Clicked="OnDigitButtonClicked" />
    </Grid>
</ContentPage>

Label和退格按钮占据顶行,但Label跨越两列,退格按钮位于第三列。 类似地,Grid的底行包含零按钮和小数点按钮,但零按钮跨越两列,这在计算机键盘上是典型的。
代码隐藏文件与XamlKeypad程序相同。 此外,程序在程序进入休眠状态时保存条目,然后在程序再次启动时恢复它们。 一个边框已经以隐式样式添加到Button中,因此它看起来更像iOS上的真实键盘:
2018_10_06_214340
您可能还记得,代码隐藏文件中的OnDigitButtonClicked处理程序使用StyleId属性将新字符附加到文本字符串。 但正如您在XAML文件中看到的那样,对于具有此事件处理程序的每个按钮,StyleId设置为与Button的Text属性相同的字符。 事件处理程序不能使用它吗?
是的,它可以。 但是假设您确定Button中的小数点没有显示得很好。您可能更喜欢使用更重且更中心的点,例如 u00B7(称为中间点)或 u22C5(数学点运算符)或 甚至 u2022(子弹)。 也许您还喜欢这些其他按钮的不同数字样式,例如以Unicode标准从 u2460开始的环绕数字集合,或者以 u2160开头的罗马数字。 您可以替换XAML文件中的Text属性,而无需触及代码隐藏文件:
2018_10_06_214504
StyleId是将用户界面的视觉和机制限制为标记并与代码分离的工具之一。 您将在下一章中看到更多用于构建程序的工具,其中包括Model-View-ViewModel应用程序架构。 该章还介绍了将键盘程序变为添加机器的变体。

目录
相关文章
MIKE 21 教程 1.2 网格搭建界面介绍之点线面要素的高阶处理 (Mesh Generator 工具)
MIKE 21 教程 1.2 网格搭建界面介绍之点线面要素的高阶处理 (Mesh Generator 工具)
|
9月前
技术分享 | ANSYS高级几何处理与网格应用技巧
Space Claim、排油烟机几何处理、流体域抽取;ANSYS Meshing、实际案例网格划分
技术分享 | ANSYS高级几何处理与网格应用技巧
|
10月前
|
数据可视化 C++
【变化检测】多时相遥感影像变化检测 Qt界面可视化 / 实现卷帘功能(附有完整代码)
【变化检测】多时相遥感影像变化检测 Qt界面可视化 / 实现卷帘功能(附有完整代码)
|
11月前
|
架构师 数据管理 数据挖掘
【数据网格】数据网格 101:入门所需的一切
【数据网格】数据网格 101:入门所需的一切
基于C#的ArcEngine二次开发26:等高线点线矛盾检查
基于C#的ArcEngine二次开发26:等高线点线矛盾检查
基于C#的ArcEngine二次开发26:等高线点线矛盾检查
|
存储 SQL 架构师
数据网格简史
数据网格简史
105 0
数据网格简史
|
人工智能 Kubernetes 监控
谈谈我对服务网格的理解
服务网格作为一种用来管理应用服务通信的基础核心技术,为应用服务间的调用带来了安全、可靠、快速、应用无感知的流量路由、安全、可观测能力。
谈谈我对服务网格的理解
|
Android开发
第二十一章:变换(十四)
3D-ish旋转 即使计算机屏幕是平面和二维的,也可以在这些屏幕上绘制视觉对象,使其具有第三维的外观。 在本章的前面,您看到了一些文本效果,它们提供了第三个维度的提示,而Xamarin.Forms支持两个额外的旋转,名为RotationX和RotationY,它们似乎也突破了屏幕固有的二维平面度。
1344 0
|
JavaScript Android开发 索引
第二十一章:变换(十二)
这两个问题都在非最小的BoxViewClock中得到解决。 XAML文件与MinimalBoxViewClock非常相似,但代码隐藏文件更为广泛。 它以名为HandParams的小结构开始,该结构定义每只手相对于半径的大小,但也包括偏移值。
1062 0
|
JavaScript Android开发
第二十一章:变换(十一)
模拟时钟用于图形用户界面的经典示例程序之一是模拟时钟。 BoxView再一次为时钟之手进行救援。 必须根据当前时间的小时,分钟和秒旋转这些BoxView元素。让我们首先使用名为AnalogClockViewModel的类来处理旋转数学,该类包含在Xamarin.
1068 0