C#使用Xamarin开发可移植移动应用(2.Xamarin.Forms布局,本篇很长,注意)附源码

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 原文:C#使用Xamarin开发可移植移动应用(2.Xamarin.Forms布局,本篇很长,注意)附源码前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.
原文: C#使用Xamarin开发可移植移动应用(2.Xamarin.Forms布局,本篇很长,注意)附源码

前言

系列目录

C#使用Xamarin开发可移植移动应用目录

源码地址:https://github.com/l2999019/DemoApp

可以Star一下,随意 - -

一点感想

很意外的,第一篇博文被博客园的编辑大哥置顶了.感谢.

评论也很多,褒贬不一,我还是那句话.技术是从无到有的过程,就像一个刚出生的人 不是说他有个强大的爸爸 所以就可以一出生就上天.

.NET如此,JAVA亦如此.言尽于此,对于喷子 好自为之..

好了,废话不多说,我们开始本章的内容.

今天的学习内容?

昨天学了内容页,当然就少不了内容页里面的布局,所以..

今天我们主要学习Xamarin.Forms中提供的各类布局手段,如图:

 

Xamarin.Forms提供了5种布局,我这里只截取了4种,第五种是ScrollView,个人觉得..这个的操作作用大于布局作用..所以本章就不讲了.

本篇很长...内容很多,且自己认为比较重要..大家耐心看

各种布局,Demo效果如下:

 

正文

0.使用Xamarin.Forms Previewer预览界面效果

Xamarin.Forms Previewer是微软提供的可以不运行程序,直接预览界面效果的工具..

因为本章主要讲布局,所以用这个会比较方便,不用每次都运行调试.

嗯,这个工具.大家凑合用 - -,因为它本身比较麻烦且会有莫名BUG,不过用顺畅了 还不错.

VS2017直接按照下图方式打开即可,VS2015 - - 我暂时没辙...

 

效果如下:

 好了,大功告成,

嗯..使用中有任何的错误 或者红色的错误提示,请重新生成程序集,或者在几个视图中跳转一下..一般都会好..(tips:这就是我说的小麻烦)

 

1.StackLayout(线性布局)

StackLayout以线性的方式进行水平或垂直的视图布局。

我们直接创建一个ContentPage.

然后添加如下Xaml代码:

    <ContentPage.Content>
        <StackLayout Spacing="10" x:Name="layout">
            <Button Text="StackLayout" VerticalOptions="Start"
        HorizontalOptions="FillAndExpand" />
            <BoxView Color="Yellow" VerticalOptions="FillAndExpand"
        HorizontalOptions="FillAndExpand" />
            <BoxView Color="Green" VerticalOptions="FillAndExpand"
        HorizontalOptions="FillAndExpand" />
            <BoxView HeightRequest="75" Color="Blue" VerticalOptions="End"
        HorizontalOptions="Start" />
        </StackLayout>
    </ContentPage.Content>

效果如图:

 

1.1布局方向

方向嘛..就是横向,和竖向.通过在StackLayout 中设置Orientation属性.

就两个选择,Horizontal(水平方向),Vertical(垂直方向)默认为Vertical

代码如下:

 <StackLayout Spacing="10" x:Name="layout" Orientation="Horizontal">
<--这里是内容-->
 </StackLayout>

1.2定位

大家可以看到,我在StackLayout 中的控件里面加了2个属性:

VerticalOptions(垂直位置)

HorizontalOptions(水平位置)

这2个属性,要求传递LayoutOptions(布局选项)的枚举,我们可以通过这里面的选择,来确定我们控件的位置.

  • Center – 将控件固定在视图的中心位置
  • End – 将控件固定在布局中的底部位置(横向布局则为最右边)
  • Fill – 将控件根据布局方向填充空余位置.
  • Start – 将控件固定在布局中的顶部位置(横向布局则为最左边)

1.3填充

在上面的定位属性后面,都可以加一个后缀AndExpand,嗯..举个例子 就是这样FillAndExpand

会产生什么效果呢?

它会根据屏幕的大小,和你布局中其他的内容,如果有空白位置就会由设置了AndExpand的自动填充.

如果多个属性都有AndExpand

则会平分空白的位置.

1.4边距

边距的设置很简单,设置StackLayout 的Spacing属性即可.

Spacing默认值为6

 

2.AbsoluteLayout(绝对定位)

这个..写过HTML的朋友们都知道,绝对定位嘛..就是根据X Y轴的坐标 直接给出控件的位置.

嗯先上列子的xaml代码吧,如下:

 <AbsoluteLayout>
         
            <Label Text="这里是数值定位"
                AbsoluteLayout.LayoutBounds="1,50,50,100" LineBreakMode="WordWrap"  />
            <Label Text="这里是按百分比例定位"
                AbsoluteLayout.LayoutBounds=".5,1,.5,.1" AbsoluteLayout.LayoutFlags="All"
                LineBreakMode="WordWrap"  />
            <BoxView Color="Olive"  AbsoluteLayout.LayoutBounds="1,.5, 25, 100" 
                AbsoluteLayout.LayoutFlags="PositionProportional" />
            <BoxView Color="Red" AbsoluteLayout.LayoutBounds="0,.5,25,100"
                AbsoluteLayout.LayoutFlags="PositionProportional" />
            <BoxView Color="Blue" AbsoluteLayout.LayoutBounds=".5,0,100,25"
                AbsoluteLayout.LayoutFlags="PositionProportional" />
        </AbsoluteLayout>

效果如下:

下面我们就来详细的讲解一下绝对定位布局相关的属性.

我们如果在AbsoluteLayout中添加控件,会发现,所有的控件,都会多出一个命名空间,下面有2个属性,如下:

讲解这2个属性之前,我们需要了解AbsoluteLayout中的2个概念,一个叫做比例值,一个叫绝对值.

其实从字面就可以看出来,比例值就是类似HTML的10%,20%之类的..绝对值就是类似HTML的5px,10px之类的

当然,我们的Xamarin有所不同.   比例值需要设置为.1(注意前面有个".", .1的意思就是10% ) 绝对值就很简单了 10, 100 ..直接给数字就行

2.1 LayoutBounds

从上面的例子我们可以看到LayoutBounds是有4个值的.类似下面:

 <Label Text="这里是数值定位"
                AbsoluteLayout.LayoutBounds="1,50,50,100" LineBreakMode="WordWrap"  />

从左至右,依次代表的意思是:

X轴的位置,Y轴的位置,控件的宽度,控件的高度.

有了上面这些属性,我们就可以很轻松的操控一个控件所在的位置和大小了.

 

2.2 LayoutFlags

上面我们说过,是分比例值与绝对值的.那怎么设置这个呢,就是通过LayoutFlags这个属性.它有7个枚举值.如下:

  • 默认 - 将所有值解析为绝对值。如果未指定LayoutFlags,则为默认值。
  • All- 将所有值解析为比例。
  • WidthProportional - 仅将Width值作为比例值,将所有其他值解析为绝对值。
  • HeightProportional - 仅将height值作为比例值,将所有其他值解析为绝对值。
  • XProportional -  仅将X轴作为比例值,将所有其他值解析为绝对值。
  • YProportional-  仅将Y轴作为比例值,将所有其他值解析为绝对值。
  • PositionProportional - X轴Y轴作为比例解析,而控件大小值被作为绝对值解析。
  • SizeProportional - 将控件大小值作为比例解析,而X轴Y轴被作为绝对值解析。

 

 

3.RelativeLayout(相对定位)

 嗯..相对定位,顾名思义..就是相对于某个控件来进行定位..也可以是整个布局

示例代码如下:

   <RelativeLayout>
            <BoxView Color="Red" x:Name="redBox"
        RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent,
            Property=Height,Factor=.15,Constant=0}"
        RelativeLayout.WidthConstraint="{ConstraintExpression
            Type=RelativeToParent,Property=Width,Factor=1,Constant=0}"
        RelativeLayout.HeightConstraint="{ConstraintExpression
            Type=RelativeToParent,Property=Height,Factor=.8,Constant=0}" />
            <BoxView Color="Blue"
        RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView,
            ElementName=redBox,Property=Y,Factor=1,Constant=20}"
        RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToView,
            ElementName=redBox,Property=X,Factor=1,Constant=20}"
        RelativeLayout.WidthConstraint="{ConstraintExpression
            Type=RelativeToParent,Property=Width,Factor=.5,Constant=0}"
        RelativeLayout.HeightConstraint="{ConstraintExpression
            Type=RelativeToParent,Property=Height,Factor=.5,Constant=0}" />
        </RelativeLayout>

效果如下:

相对定位的东西比较复杂,仔细阅读吧.

 

3.1 Constraint(约束)

相对定位有个叫做约束的概念,所以我们可以看到.在RelativeLayout的里面,所有的控件 都会出现下面几种属性

XConstraint ,YConstraint, WidthConstraint,HeightConstraint

其实看前面,大家就应该知道是X Y 宽 高.

里面的写法 类似于JSON,如下:

 

  RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView, ElementName=redBox,Property=Y,Factor=1,Constant=20}"

 

大口号前面定义ConstraintExpression,代表它为约束的表达式.

里面有5个属性,解释如下:

  • Type – 类型,有2个选择RelativeToParentRelativeToView,看单词大家应该就明白了,一个是针对于父节点的相对定位,一个是针对某一个视图的相对定位
  • Property – 你要设置的什么属性,例如Property=Height,就是你要设置的是高度的属性.
  • Factor – 你要相对于某视图的比例值,比如A控件高度是100,你这里输入.5, 那么就是50.
  • Constant – 你要调整的属性值,因为上面只能设置比例,所以通过这个属性来微调位置,设置负数就是减去你设置的值,正数就是加
  • ElementName – 你要相对的控件的Name,例如:ElementName=redBox, 就是相对于 x:Name属性为redBox的控件.(例子中的红色块)  

 

 

4.Grid(表格布局)

Gird表格布局,支持将视图排列成行和列。行和列可以设置为比例值或绝对值。

Gird布局不应该与传统的表格相混淆,并且他的作用并不是呈现表格数据。

它不像HTML中的Table,Gird纯粹是为了布局内容。

例子代码如下:

            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="4*" />
                    <RowDefinition Height="*"  />
                    <RowDefinition Height="200" />
                    <RowDefinition Height="2*" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="2*" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <BoxView  BackgroundColor="Red" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Grid.Row="0" Grid.Column="0" />
                <Label Text="Top Right" Grid.Row="0" Grid.Column="1" />
                <Label Text="Bottom Left" Grid.Row="1" Grid.Column="0" BackgroundColor="Cyan" Grid.ColumnSpan="2" />
                <!--<Label Text="Bottom Right" Grid.Row="1" Grid.Column="1" />-->
                <BoxView  BackgroundColor="Blue" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Grid.Row="2" Grid.Column="0" />
                <BoxView  BackgroundColor="Green" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Grid.Row="2" Grid.Column="1" Grid.RowSpan="2" />
                <BoxView  BackgroundColor="AliceBlue" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Grid.Row="3" Grid.Column="0" />
                
            </Grid>

效果如下:

 

4.1 Grid.RowDefinitions

它是设置Grid行数的容器,应该放在Grid标签里面,例子如下:

            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="4*" />
                    <RowDefinition Height="*"  />
                    <RowDefinition Height="200" />
                    <RowDefinition Height="2*" />
                </Grid.RowDefinitions>
            </Grid>

这样就设置了一个为4行的Grid,可以通过Height属性来设置它的高."*"号为百分比设置  2*表示为20%. 直接设置绝对值也可以,如例子中的Height="200"

 

4.2 Grid.ColumnDefinitions

它是设置Grid列数的容器,应该放在Grid标签里面,例子如下:

<Grid>
<Grid.ColumnDefinitions>
                    <ColumnDefinition Width="2*" />
                    <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
</Grid>

这样就设置了一个为2列的Grid,可以通过Width属性来设置它的高."*"号为百分比设置  2*表示为20%. 直接设置绝对值也可以,如Width="200"

 

4.3  设置Grid中的内容.

很简单,直接在Grid中添加控件,并写好对应的行列就行了.如下

 <Label Text="Top Right" Grid.Row="0" Grid.Column="1" />

那么,这个label控件就会显示在Grid中的第一行 第二列(注意:这里的行列都是从0开始)

 

4.4  如何跨行,跨列

跨行,跨列也很简单,如下:

<Label Text="Bottom Left" Grid.Row="1" Grid.Column="0" BackgroundColor="Cyan" Grid.ColumnSpan="2" />
<BoxView  BackgroundColor="Green" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Grid.Row="2" Grid.Column="1" Grid.RowSpan="2" />

直接设置Grid.ColumnSpanGrid.RowSpan 即可,HTML中的Table已经用过很多次了..我就不多解释了.

 

4.5  如何设置行间距与列间距

 嗯..同样简单,直接设置Grid标签的ColumnSpacingRowSpacing即可.如下:

<Grid ColumnSpacing="5" RowSpacing="10">
</Grid>

上面的列子就是行间距为10,列间距为5.

 

写在最后

好了,到此,本篇的布局就结束了...

不管你们怎么说..是骂我坑也好..是说Xamarin不行也好..本系列都会坚持写完.

最后,感谢点推荐的兄弟们,感谢那些一直支持着我的朋友们,谢谢.

目录
相关文章
|
23天前
|
JSON C# 开发者
💡探索C#语言进化论:揭秘.NET开发效率飙升的秘密武器💼
【8月更文挑战第28天】C#语言凭借其强大的功能与易用性深受开发者喜爱。伴随.NET平台演进,C#持续引入新特性,如C# 7.0的模式匹配,让处理复杂数据结构更直观简洁;C# 8.0的异步流则使异步编程更灵活高效,无需一次性加载全部数据至内存。通过示例展示了模式匹配简化JSON解析及异步流实现文件逐行读取的应用。此外,C# 8.0还提供了默认接口成员和可空引用类型等特性,进一步提高.NET开发效率与代码可维护性。随着C#的发展,未来的.NET开发将更加高效便捷。
39 1
|
20天前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
42 0
|
20天前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
24 0
|
20天前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
49 0
|
2月前
|
SQL 开发框架 前端开发
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
|
3月前
|
C# 图形学 C++
使用vscode开发C#+unity没有代码提示问题
使用vscode开发C#+unity没有代码提示问题
50 0
使用vscode开发C#+unity没有代码提示问题
|
2月前
|
监控 测试技术 C#
推荐一个使用 C# 开发的轻量级压测工具
推荐一个使用 C# 开发的轻量级压测工具
|
11月前
|
开发工具 Android开发 iOS开发
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
使用vs2019学习xamarin时,创建新程序。使用模拟器真机等测试都报错如下图错误: ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/column/article/5877188/20231030-de8ce5fd.png?x-cos-security-token=r4KyZDEowPT0kGTL0LqE8EnwfN1Nzexadb05dcffed3939ff8d7591c528c01706nvpGSE93QwHpZM8NwhJNTZctNRQa0l3KDhEnqj8P7d8t
109 0
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
|
Java C# Android开发
.NET(WinCE、WM)开发转Android开发 ——Xamarin和Smobiler对比
WinCE从1995年诞生至今,已有20多年的发展历史,行业成熟方案覆盖范围广,从车载、工控、手持机都有涉及,且方案成熟。 近些年,Android以后来居上的态势,逐渐渗透至各行业领域,硬件手持大厂也把产品线重心向Android手持迁移,基于Android的行业解决方案越来越成熟,WinCE的开发人才流失,在WinCE解决方案上吃老本的企业寻求转型。
|
Web App开发 测试技术 Android开发
xamarin开发android收集的一些工具
原文:xamarin开发android收集的一些工具 xamarin开发android收集的一些工具 工欲善其事,必先利其器,从16年下半年开始做xamarin相关的开发,平时使用的一些工具和google插件给大家分享一下,都有下载地址,持续更新。
1525 0