如何更改 屏幕以使用

2023-12-20

我有这个代码,目前是 和 的组合

我想转向相对布局,但还没有看到这么多这样的例子。对于如何实现这一点的任何建议,我们将不胜感激。

关于 XAML 的一些要点。

  • 屏幕上出现emptyGrid或phraseGrid
  • 屏幕上出现buttonGrid或tapGrid
  • 按钮和点击标签的垂直中心应处于同一位置。这样,当按钮未显示时,点击标签会出现在与按钮相同的垂直按钮上。
  • 框架出现在选项卡式页面内

我意识到这不仅仅是一个简单的问题,但我相信其他人也会对此感兴趣。由于答案可能相当复杂,我将在几天内为此提供 250 点的赏金。

    <Grid x:Name="emptyGrid" Grid.Row="1" Grid.Column="0" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
        <StackLayout Padding="10,0,10,0" HorizontalOptions="Center" VerticalOptions="Center">
            <Label x:Name="emptyLabel" FontSize="18" XAlign="Center" TextColor="Gray" />
        </StackLayout>
        <Button x:Name="resetButton" Text="Reset points?" TextColor="White" FontAttributes="Bold" FontSize="20" HeightRequest="60" BackgroundColor="#E19A3F" HorizontalOptions="FillAndExpand" VerticalOptions="StartAndExpand">
            <Button.FontSize>
                <OnPlatform x:TypeArguments="x:Double" iOS="25" Android="20" />
            </Button.FontSize>
        </Button>
    </Grid>

    <Grid x:Name="phraseGrid" Padding="20, 20, 20, 20" BackgroundColor="Transparent" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
        <Grid.RowDefinitions>
            <RowDefinition Height="6*" />
            <RowDefinition Height="6*" />
            <RowDefinition Height="80*" />
            <RowDefinition Height="13*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Grid x:Name="prGrid" Grid.Row="0" Grid.Column="0" 
            Padding="5,0,0,0" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"
            BackgroundColor>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="25*" />
                <ColumnDefinition Width="25*" />
                <ColumnDefinition Width="50*" />
            </Grid.ColumnDefinitions>
            <Label x:Name="msg1" Style="{StaticResource smallLabel}" Text="msg1" Grid.Row="0" Grid.Column="0" />
            <Label x:Name="msg2" Style="{StaticResource smallLabel}" Text="msg2" Grid.Row="0" Grid.Column="1" />
            <Label x:Name="msg3" Style="{StaticResource smallLabel}" Text="msg3" Grid.Row="0" Grid.Column="2" />
        </Grid>

        <Grid x:Name="siGrid" Grid.Row="1" Grid.Column="0" 
            Padding="5,0,0,0" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="25*" />
                <ColumnDefinition Width="25*" />
                <ColumnDefinition Width="50*" />
            </Grid.ColumnDefinitions>
            <Label x:Name="faveLabel" Style="{StaticResource smallLabel}" FontFamily="FontAwesome" Grid.Row="0" Grid.Column="0" />
            <Label x:Name="wordTypeLabel" Style="{StaticResource smallLeftLabel}" Grid.Row="0" Grid.Column="1" />
        </Grid>

        <Grid x:Name="wordGrid" Grid.Row="2" Grid.Column="0" 
            HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
            <Grid.RowDefinitions>
                <RowDefinition Height="45*" />
                <RowDefinition Height="55*" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Grid Grid.Row="0" Grid.Column="0" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
                <Label x:Name="textLabel" FontSize="45" XAlign="Center" VerticalOptions="Center" LineBreakMode="WordWrap" />
            </Grid>
            <Grid x:Name="detailGrid" Grid.Row="1" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Padding="10,0,10,0">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Label x:Name="detail1" Grid.Row="0" Style="{StaticResource bigLabel}" />
                <Label x:Name="detail2" Grid.Row="1" Style="{StaticResource bigLabel}" />
                <Label x:Name="detail3" Grid.Row="2" Style="{StaticResource bigLabel}" />
            </Grid>
        </Grid>

        <Grid x:Name="buttonGrid" Grid.Row="3" Grid.Column="0" 
            HorizontalOptions="FillAndExpand" VerticalOptions="Center" Padding="20, 0">
            <Button x:Name="aButton" Style="{StaticResource pointButton}" Grid.Column="0" Text="0">
            </Button>
            <Button x:Name="bButton" Style="{StaticResource pointButton}" Grid.Column="1" Text="1">
            </Button>
            <Button x:Name="cButton" Style="{StaticResource pointButton}" Grid.Column="2" Text="2">
            </Button>
            <Button x:Name="dButton" Style="{StaticResource pointButton}" Grid.Column="3" Text="5">
            </Button>
        </Grid>

        <Grid x:Name="tapGrid" Grid.Row="3" Grid.Column="0" HorizontalOptions="FillAndExpand" VerticalOptions="Center">
            <Label x:Name="tapScreenLabel" Style="{StaticResource smallLabel}" />
        </Grid>

    </Grid>
</StackLayout>

Code

其源代码可以在 GitHub 中找到:https://github.com/brminnick/GridToRelativeLayout https://github.com/brminnick/GridToRelativeLayout

public class RelativeLayoutPage : ContentPage
{
    public RelativeLayoutPage()
    {
        var emptyLabel = new Label
        {
            Text = "Empty Label",
            Margin = new Thickness(10, 0, 10, 0),
            FontSize = 18,
            TextColor = Color.Gray,
            HorizontalTextAlignment = TextAlignment.Center
        };

        var resetPointsButton = new Button
        {
            BackgroundColor = Color.FromHex("E19A3F"),
            Text = "Reset points?",
            TextColor = Color.White,
            FontAttributes = FontAttributes.Bold,
        };
        switch (Device.RuntimePlatform)
        {
            case Device.Android:
                resetPointsButton.FontSize = 20;
                break;
            case Device.iOS:
                resetPointsButton.FontSize = 25;
                break;
        }

        var msg1Label = new Label
        {
            Text = "msg1",
            Margin = new Thickness(0, 26, 0, 0)
        };
        var msg2Label = new Label
        {
            Text = "msg2",
            Margin = new Thickness(0, 26, 0, 0)
        };
        var msg3Label = new Label
        {
            Text = "msg3",
            Margin = new Thickness(0, 26, 0, 0)
        };

        var faveLabel = new Label { Text = "Fave Label" };
        var wordTypeLabel = new Label { Text = "Word Type Label" };

        var textLabel = new Label
        {
            Text = "Text Label",
            FontSize = 45,
            HorizontalTextAlignment = TextAlignment.Center,
            VerticalTextAlignment = TextAlignment.Center
        };

        var detail1Label = new Label
        {
            Text = "Detail 1 Label",
            Margin = new Thickness(10, 0)
        };
        var detail2Label = new Label
        {
            Text = "Detail 2 Label",
            Margin = new Thickness(10, 0)
        };
        var detail3Label = new Label
        {
            Text = "Detail 3 Label",
            Margin = new Thickness(10, 0)
        };

        var zeroButton = new Button
        {
            Text = "0",
            Margin = new Thickness(0, 0, 0, 20)
        };
        var oneButton = new Button
        {
            Text = "1",
            Margin = new Thickness(0, 0, 0, 20)
        };
        var twoButton = new Button
        {
            Text = "2",
            Margin = new Thickness(0, 0, 0, 20)
        };
        var fiveButton = new Button
        {
            Text = "5",
            Margin = new Thickness(0, 0, 0, 20)
        };

        var tapScreenLabel = new Label
        {
            Text = "Tap Screen",
            Margin = new Thickness(0, 0, 0, 20),
            VerticalTextAlignment = TextAlignment.Center,
            VerticalOptions = LayoutOptions.Center
        };

        Func<RelativeLayout, double> GetZeroButtonHeight = parent => zeroButton.Measure(parent.Width, parent.Height).Request.Height;
        Func<RelativeLayout, double> GetOneButtonHeight = parent => oneButton.Measure(parent.Width, parent.Height).Request.Height;
        Func<RelativeLayout, double> GetTwoButtonHeight = parent => twoButton.Measure(parent.Width, parent.Height).Request.Height;
        Func<RelativeLayout, double> GetFiveButtonHeight = parent => fiveButton.Measure(parent.Width, parent.Height).Request.Height;

        var relativeLayout = new RelativeLayout();
        relativeLayout.Children.Add(emptyLabel,
                                    Constraint.Constant(0),
                                    Constraint.Constant(0),
                                    Constraint.RelativeToParent(parent => parent.Width));
        relativeLayout.Children.Add(resetPointsButton,
                                    Constraint.Constant(0),
                                    Constraint.Constant(0),
                                    Constraint.RelativeToParent(parent => parent.Width));
        relativeLayout.Children.Add(msg1Label,
                                    Constraint.Constant(25),
                                    Constraint.RelativeToView(resetPointsButton, (parent, view) => view.Y + view.Height),
                                    Constraint.RelativeToParent(parent => parent.Width * 0.25));
        relativeLayout.Children.Add(msg2Label,
                                    Constraint.RelativeToView(msg1Label, (parent, view) => view.X + view.Width),
                                    Constraint.RelativeToView(resetPointsButton, (parent, view) => view.Y + view.Height),
                                    Constraint.RelativeToParent(parent => parent.Width * 0.25));
        relativeLayout.Children.Add(msg3Label,
                                    Constraint.RelativeToView(msg2Label, (parent, view) => view.X + view.Width),
                                    Constraint.RelativeToView(resetPointsButton, (parent, view) => view.Y + view.Height),
                                    Constraint.RelativeToParent(parent => parent.Width * 0.5));
        relativeLayout.Children.Add(faveLabel,
                                    Constraint.Constant(25),
                                    Constraint.RelativeToView(msg1Label, (parent, view) => view.Y + view.Height + 20),
                                    Constraint.RelativeToParent(parent => parent.Width * 0.25));
        relativeLayout.Children.Add(wordTypeLabel,
                                    Constraint.RelativeToView(faveLabel, (parent, view) => view.X + view.Width),
                                    Constraint.RelativeToView(msg1Label, (parent, view) => view.Y + view.Height + 20),
                                    Constraint.RelativeToParent(parent => parent.Width * 0.25));
        relativeLayout.Children.Add(textLabel,
                                    Constraint.Constant(20),
                                    Constraint.RelativeToView(faveLabel, (parent, view) => view.Y + view.Height + 20),
                                    Constraint.RelativeToParent(parent => parent.Width - 40),
                                    Constraint.RelativeToParent(parent => parent.Height * 0.25));
        relativeLayout.Children.Add(detail1Label,
                                   Constraint.Constant(20),
                                   Constraint.RelativeToView(textLabel, (parent, view) => view.Y + view.Height + 20));
        relativeLayout.Children.Add(detail2Label,
                                   Constraint.Constant(20),
                                   Constraint.RelativeToView(detail1Label, (parent, view) => view.Y + view.Height));
        relativeLayout.Children.Add(detail3Label,
                                   Constraint.Constant(20),
                                   Constraint.RelativeToView(detail2Label, (parent, view) => view.Y + view.Height));
        relativeLayout.Children.Add(zeroButton,
                                    Constraint.Constant(40),
                                    Constraint.RelativeToParent(parent => parent.Height - GetZeroButtonHeight(parent) - 40),
                                    Constraint.RelativeToParent(parent => (parent.Width - 80) / 4));
        relativeLayout.Children.Add(oneButton,
                                    Constraint.RelativeToView(zeroButton, (parent, view) => view.X + view.Width),
                                    Constraint.RelativeToParent(parent => parent.Height - GetZeroButtonHeight(parent) - 40),
                                    Constraint.RelativeToParent(parent => (parent.Width - 80) / 4));
        relativeLayout.Children.Add(twoButton,
                                    Constraint.RelativeToView(oneButton, (parent, view) => view.X + view.Width),
                                    Constraint.RelativeToParent(parent => parent.Height - GetZeroButtonHeight(parent) - 40),
                                    Constraint.RelativeToParent(parent => (parent.Width - 80) / 4));
        relativeLayout.Children.Add(fiveButton,
                                    Constraint.RelativeToView(twoButton, (parent, view) => view.X + view.Width),
                                    Constraint.RelativeToParent(parent => parent.Height - GetZeroButtonHeight(parent) - 40),
                                    Constraint.RelativeToParent(parent => (parent.Width - 80) / 4));
        relativeLayout.Children.Add(tapScreenLabel,
                                    Constraint.Constant(20),
                                    Constraint.RelativeToView(zeroButton, (parent, view) => view.Y),
                                    Constraint.RelativeToParent(parent => parent.Width - 40));

        Padding = GetPadding();
        Content = relativeLayout;
    }

    Thickness GetPadding()
    {
        switch (Device.RuntimePlatform)
        {
            case Device.iOS:
                return new Thickness(0, 20, 0, 0);
            default:
                return default(Thickness);
        }
    }
}

iOS Demo

安卓演示

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

如何更改 屏幕以使用 ? 的相关文章

随机推荐

  • 自定义订单详细信息页面上的 Woocommerce 自定义字段

    查看文档 似乎没有明确的方法在客户的订单详细信息页面上显示自定义字段 我可以毫无问题地将自定义字段显示在管理订单详细信息或客户的电子邮件上 我可以看到可以完成的唯一方法是复制主题文件夹中的 woocommerce order order d
  • 如何使用 Geckodriver 保留 Firefox 配置文件的缓存?

    我需要用 Selenium 保留我的缓存Geckodriver 我有一个 Firefox 配置文件 我在启动时加载它Geckodriver ProfilesIni profilesIni new ProfilesIni FirefoxPro
  • 学说 ORM 条件关联

    我正在建立一个问答网站 我的问题 答案和评论都在同一个网站上posts桌子 但他们的postType是不同的 我可以通过该协会获得问题的答案和答案的评论 OneToMany targetEntity Cms Entity Post mapp
  • AWS RDS:如何使用boto3和jmespath获取最新快照?

    这是我尝试过的 usr bin env python3 import boto3 import jmespath from datetime import datetime timedelta now datetime utcnow yes
  • 如何在python中查找当前目录中文件名与特定模式匹配的所有文件?

    我试图在与我的脚本相同的目录中查找文件名与特定模式匹配的所有文件 理想情况下 我想在获得它们后将其存储在数组中 我需要匹配的模式是这样的 testing JUNK 08 05 txt 所有文件名的前面都有测试 并以日期结尾 08 05 tx
  • Google/Facebook 注册 Azure AD B2C 后跳过验证页面

    我想禁用 跳过要求在 Google Facebook 注册后修改显示名称 名字 姓氏的验证页面 我想直接重定向到我的应用程序 我正在使用 AD B2C 自定义策略 我尝试删除 InputClaims 和 OutputClaims
  • 在 python alpine docker 中安装 python numpy 模块

    我正在尝试 dockerize 我的 python 应用程序 构建 Dockerfile 和安装依赖项时显示错误scikit learn ie numpy Dockerfile FROM python alpine3 8 RUN apk u
  • 改进 Ubuntu 12.04 (GTK) 下的 JFileChooser

    我有一个问题JFileChooser在 Ubuntu 12 04 下 我使用此代码来设置外观 javax swing UIManager setLookAndFeel javax swing UIManager getSystemLookA
  • 检查 Android Media Player 是否可以播放文件

    在Android中 有没有办法检查给定文件是否是媒体播放器的合法文件 这是我当前测试文件是否可以在媒体播放器中播放的方法 public boolean isPlayable File file try Uri uri Uri fromFil
  • 使用 Java 将 Paypal 集成到 Web 应用程序中

    我想将 paypal 集成到我的网络应用程序中 我正在使用 RESTEasy API 来处理宁静的请求 我想知道如何将 paypal 集成到我的应用程序中 我已经从他们的网站下载了 paypal java sdk 但现在我没有好的应用程序可
  • Powershell:导入模块

    我一直在尝试在 win2008 标准服务器上使用应用程序结构缓存 当我执行以下命令时 我得到 导入模块分布式缓存管理 Import Module 未加载指定的模块 DistributedCacheAdministration 因为在任何模块
  • 加载位图时出现内存不足错误

    我有一个带有 3 个活动的 Android 应用程序 A1 starts gt A2 starts gt A3 当完成他的过程时 开始 gt A1 所以我不会 finish 应用程序 我在用户交互后始终用 startActivity 开始下
  • Seaborn ValueError:零大小数组到没有身份的缩减操作最小值

    我从他们自己的例子中运行了这个散点图seaborn示例website https seaborn pydata org generated seaborn scatterplot html import seaborn as sns sns
  • System.Drawing.Image.FromStream() 方法中的“参数无效”异常

    我在网站中使用 Image FromStream 方法时遇到了困难 下面的代码在我的电脑上完美运行 但是当我将其上传到测试服务器时 它总是给出 参数无效 异常 if afuImageFile IsUploading afuImageFile
  • 如何设置散景中选定/未选定字形的属性

    我有一个由一些可观测值的时间序列组成的数据集 我想使用散景来查看时间序列中不同点的相图 我想知道的是如何更改选定或未选定字形的属性 在这种情况下 我想减少未选定点的 alpha 或更改选定点的颜色 下面的代码创建了我想要在 ipython
  • 验证器和 ClientIDMode 问题 (ASP.NET)

    ASP NET 4 0 引入了 ClientIDMode 属性 它允许指定如何在输出 html 中呈现 html 元素的 id 我的项目当前设置为 静态 最短 不包含层次结构 ID 当使用任何验证器时 RequiredFieldValida
  • Angular 2 - 在会话中存储的便捷方式

    有没有一种方便的方法可以保存在 sessionStorage 中 而不需要手动监视属性更改和更新 例如 我有一个带有属性 query 的 SearchComponent export class SearchComponent privat
  • 如何在 UISplitViewController 中命名后退按钮

    I have UITableViewController 其名称为新闻 和UIViewController 其名称为 DetailViewController 和UISplitViewController 我希望它在纵向使用 iPad 时显
  • 使用 File.Copy 移动文件或将流写入该位置有什么区别吗?

    我正在重构一些代码 并且有一个问题 我可以对其进行一些评论 原始代码将文件下载到流中 然后 它将流写入临时目录中的文件 然后使用 File Copy 覆盖生产目录中的现有文件 首先将其写入临时目录并使用 File Copy 与立即将流写入生
  • 如何更改 屏幕以使用

    我有这个代码 目前是 和 的组合 我想转向相对布局 但还没有看到这么多这样的例子 对于如何实现这一点的任何建议 我们将不胜感激 关于 XAML 的一些要点 屏幕上出现emptyGrid或phraseGrid 屏幕上出现buttonGrid或