MAUI新生6.1:控件总览
一、MAUI控件分类及使用技巧
1、根据控件的功能特点,以及个人的习惯,我将MAUI的控件划分为以下几个大类:
- 页面类;
- 布局类;
- 单一内容类;
- 集合内容类;
- 表单类;
- 容器类
- 形状类;
- 窗口类;
- 辅助功能类,如动画、手势、可访问性等;
2、在MAUI的UI界面设计中,大概遵循以下步骤:
- 确定页面的类型(页面类控件);
- 从全局到局部,进行布局规划(布局类控件);
- 确定呈现的数据,是单一内容、集合内容、表单还是形状?根据内容的具体形式,选择相应的控件
- 增加辅助功能,如动画、手势、可访问性、提示等
3、其它使用技巧
- MAUI开发应遵循MVVM模式,在进行UI设计前,先开发ViewModel,定义好页面的数据和业务逻辑后,再根据数据和业务逻辑,进行UI设计。
- 只要掌握了前面几个章节的原理介绍,控件使用就很简单,不需要特别记,边用边查,多用几次,自然就能熟练
- 可以在编码时,随时右击查看控件定义或直接使用属性面板,大多数属性和事件,都能够见名知意
- 控件的常用样式属性,应该要非常熟悉,这些属性在很多控件上都能通用,如下所示:
//1、布局类 背景:Background-背景、BackgroundColor-背景色、HasShadow-是否有阴影 边框:CornerRadius-圆角、BorderColor-边框颜色、BorderWidth-边框宽度
外轮廓:Stroke-外轮廓画笔、StrokeShape-形状、StrokeThickness-宽度、StrokeDashArray-长短线样式、StrokeLineCap-起终点样式 宽高:WidthRequest-宽、HeightRequest-高、MaximumWidthRequest、MinimumWidthRequest等 对齐:VerticalOptions-垂直对齐、HorizontalOptions-水平对齐 间距:Margin-外边距,Padding-内边距 //2、文本类 内容:Text-文内容 颜色:TextColor-文本颜色 字体:FontFamily-字体 大小:FontSize-字体大小 样式:FontAttributes-加粗斜体、TextDecorations-上划线下划线、TextTransform-大小写、FontAutoScalingEnabled-自动缩放 排列①:VerticalTextAlignment-文本垂直对齐、HorizontalTextAlignment-文本居中对齐
排列②:CharacterSpacing-间距、LineHeight-行距、LineBreakMode-跨行、MaxLines-最大行 //3、图片类 来源:Source-图片源、ImageSource-图片源 其它:IsLoading-加载、Aspect-缩放、IsAnimationPlaying-gif播放、IsOpaque-不透明
二、控件总览(囊括了官方控件和Community.Toolkit社区工具包的扩展控件):
1、页面类
1)控件目录:
- ContentPage,普通内容页
- NavigationPage,导航页
- FlyoutPage,浮出导航页
- TabbedPage,底部Tab栏导航页
2)使用经验:
- 如果使用Shell导航框架,则NavigationPage/FlyoutPage/TabbedPage均不兼容。
- Shell导航的ShellContent,只能是ContentPage。
- Shell的底层实现,推测是通过NavigationPage、FlyoutPage和TabbedPage来实现。
- 正常情况下,我们直接使用Shell。如果不使用Shell,则使用NavigationPage、FlyoutPage、TabbedPage。
- MAUI Blaozr 不支持Shell,导航需要使用NavigationPage
2、布局类
1)控件目录:
- Grid,网格布局。子元素按行列布局,类似于在Word里画表格
- FlexLayout,弹性布局。和前端的Flex弹性布局基本一样
- StackLayout,堆叠布局。子元素按指定方向逐行(列)堆叠。如果能确定堆叠方向,建议使用横向或纵向堆叠布局
- HorizontalStackLayout,横向堆叠布局。子元素在水平方向上逐列堆叠,性能比StackLayout好。
- VerticalStackLayout,纵向堆叠布局。子元素在垂直方向上逐行堆叠,性能比StackLayout好。
- AbsouteLayout,绝对布局。可以定义子元素的绝对位置
- DockLayout,停靠式布局。子元素可以固定停靠在上下左右位置。DockPanel是WPF的内置控件,但MAUI给取消了,【Community.Toolkit.Maui】补充了这个控件
- UniformItemsLayout,大小一致的网格布局。子元素按行列布局,且单元格大小一致。和DockPanel,UniformGrid本也是WPF的内置控件,但MAUI给取消了,【Community.Toolkit.Maui】中补充了这个控件
- BindableLayout,绑定附加属性。作为附加属性应用于其它布局,功能上类似于集合类控件,适用于条目数较少、无滚动、无选择的情况
- StateContainer,状态附加属性。作为附加属性应用于其它布局,根据用户定义的状态数值,显示不同的元素块,由【Community.Toolkit.Maui】提供
2)使用经验:
- 根据实际情况和个人偏好,选用Grid或FlexLayout进行整体布局。推荐Grid,但习惯前段Flex布局的,可能更喜欢FlexLayout。
- 局部布局,根据需要首选HorizontalStackLayout、VerticalStackLayout或AbsouteLayout,复杂一些的可以用FlexLayout。只有在运行时需要改变排列方向时,才选用StackLayout。
- MAUI取消了DockLayout和UniformItemsLayout,总有其原因,Grid和FlexLayout吃透了,应该很少会用到。
- BindableLayout和StateContainer,是附加属性,Grid、StackLayout、FlexLayout等布局控件都可以使用,提供的功能还是很实用,建议掌握。
3、单一内容类
1)控件目录:
- Label,显示单行或多行文本
- Button,按钮
- ImageButton,图片按钮
- BoxView,指定宽高颜色的简单矩形,可用于占位
- Image,显示本地/URI/嵌入式/流式图片
- AvatarView,头像或首字母缩写,由【Community.Toolkit.Maui】提供
- Map,显示和批注地图
- MediaElement,视频和音频播放,由【Community.Toolkit.Maui】提供
- DrawingView,手写板,可用于签名,由【Community.Toolkit.Maui】提供
- Expander,可折叠面板,点击标头可以隐藏或显示内容,由【Community.Toolkit.Maui】提供
- SearchBar,搜索框
2)使用经验:
- 单一内容类控件,涵盖了文本、图片、多媒体、地图等内容形式,使用都较简单,可以直接查看文档。
- 内置的控件还不是很丰富,比如Map的可用性较差,需要使用GoogleMap。而多媒体控件,直到2023年1月才出现,还是以社区控件的方式。
4、集合内容类
1)控件目录
- ListView,数据列表
- CollectionView,数据列表,ListView的替代方案。相比ListView,更灵活、更高性能
- CarouselView/IndicatorView,轮播图及其指示器
- BindableLayout,详见布局章节,比较特殊。当集合内容较少,不需要选择和滚动时,可以使用BindableLayout
2)使用经验
- 数据列表首选CollectionView,默认支持原生控件的虚拟化,性能更高。同时,支持单选和多选、水平和垂直布局、去除了单元格的概念等,比ListView,更加灵活和简单。
- CarouselView的使用方法,和CollectionView非常像。只要熟练掌握了CollectionView,CarouselView基本就没问题。同时,IndicatorView是结合CarouselView使用的,也很简单。
- 如果需要传统Web端的表格功能,建议使用大多数第三方控件都有提供的DataGrid控件,能够提供功能非常完善的表格功能。
5、表单类控件
1)控件目录
- Entry,单行输入框
- Edit,多行输入框
- CheckBox,复选框
- RadioButton,单选框
- Picker,下拉单选框
- Switch,开关
- Slider,滑块
- Stepper,步进器
- DataPicker,日期选择框
- TimePicker,时间选择框
- ActivityIndicator,显示等待
- ProgressBar,进度条
2)使用经验
- 表单类控件的使用都比较简单,没有特别复杂的操作。
- 但是内置的表单控件不够丰富,如下拉多选框、复选框组、联级选择、时间范围、富文本框、评分、树状选择器等,目前都缺失,需要补充第三方控件库
- 由于表单类控件主要应用于数据输入,所以实际开发中,都要结合数据绑定和数据验证使用。
6、容器类控件
1)控件目录:
- Frame,为子控件添加边框背景等装饰
- Border,为子控件添加边框背景等装饰,功能比Frame更丰富,可以视为Frame的替代
- ScrollView,为子控件提供滚动功能
- RefreshView,为子控件提供拉取刷新功能,其子控件必须是可滚动控件,如ScrollView、CollectionView、ListView等
- SwipeView,滑动轻扫控件时显示轻扫项
- TwoPanelView,双面板容器,可以可折叠设置
- WebView,显示远程网页或本地HTML文件,提供了CSS、JS和Cookie支持
- BlazorWebView,由MAUI托管Blazor
2)使用经验
- 容器类控件相当于一个包装器,为其子控件提供了特定功能。
- BlazorWebView是实现BlazorHybrid开发模式的入口控件,使我们可以使用Blazor技术来开发跨平台应用,特别重要。
7、形状类控件
1)控件目录:
- Line,线条
- Polyline,折线
- Path,路径,提供了最丰富的绘制功能,需要熟悉Path.Data的使用方法
- Ellipse,椭圆形
- Rectangle,矩形
- RoundRectangle,圆角短形
- Polygon,多边形
2)使用经验:
- Shape可以直接在页面上进行绘图。MAUI另外还提供了一套基于Graphics的绘图机制,可以绘制更加复杂的图形,甚至可以进行UI绘制,实现类似Flutter的渲染功能。
- Path的使用非常灵活,所以也比较复杂,如果应用有绘图方面的功能需求,应该要熟练掌握。
8、窗口类控件
1)控件目录:
- ToolTipProperties,提示小窗口,作为控件附加属性使用
- DisplayAlert,警告弹窗
- DisplayActionSheet,选择项弹窗
- DisplayPromptAsync,输入项弹窗
- MenuBarItem,适合桌面应用的菜单栏
- MenuFlyout,适合桌面应用的鼠标右键菜单
- Snackbar,显示在底部的计时警报弹窗,由【Community.Toolkit.Maui】提供
- Toast,显示在底部的计时警报弹窗,由【Community.Toolkit.Maui】提供
- Popup,模态弹窗,可以定义丰富的UI,由【Community.Toolkit.Maui】提供
- Window,提供了多窗口功能,虽然手机端也支持,但更适用于桌面端应用
2)使用经验:
- 内置导航的Navigation对象,也支持模式导航,但Popup可以进行更丰富的控制
- 桌面端应用的多窗口需求会比较普遍,多窗口的操作方式应该要掌握
8、辅助功能
1)功能目录:
- 动画Animation,提供了基本的动画功能。以后台代码方式使用
- 手势GestureRecognizers,识别手势操作。以附加属性方式使用
- 可访问性Semantic,提供了一系列辅助功能,如提示、屏幕阅读等。以附加属性方式使用
- 绘图画布Graphics,提供一个独立的画布进行绘图
2)使用经验:
- 除绘图画布以外,其它几个辅助功能都比较常用,需要掌握
- 绘图画布Graphics提供了类似Flutter一样的自绘功能