MAUI中构建跨平台原生控件实现

简介

MAUI中使用Handler体系来处理不同平台的原生控件实现, 即对应的, 如果我们想要创建控件, 只需要创建基于不同平台的Handler即可。
那么下面主要教大家如何通过创建Handler(事件处理程序)来构建自己的控件。

开始

下面, 将通过创建一个进度条控件案例, 来演示如何在MAUI项目中创建平台控件并且使用它。
假设控件包含基础的三项功能, 进度条颜色(Foreground)、进度条当前值(Value)、进度条模式(Indeterminate)
1.第一步(声明控件类)
首先, 创建MyProgressBar类, 定义对应的依赖属性

internal class MyProgressBar : View{public static readonly BindableProperty ForegroundProperty =BindableProperty.Create(nameof(Foreground),typeof(Color),typeof(MyProgressBar),Colors.Transparent);public static readonly BindableProperty ValueProperty =BindableProperty.Create(nameof(Value),typeof(double),typeof(MyProgressBar),0.0);public static readonly BindableProperty IndeterminateProperty =BindableProperty.Create(nameof(Indeterminate),typeof(bool),typeof(MyProgressBar),false);public Color Foreground{get { return (Color)GetValue(ForegroundProperty); }set { SetValue(ForegroundProperty, value); }}public double Value{get { return (double)GetValue(ValueProperty); }set { SetValue(ValueProperty, value); }}public bool Indeterminate{get { return (bool)GetValue(IndeterminateProperty); }set { SetValue(IndeterminateProperty, value); }}}

2.第二步(创建标准处理程序)
有了控件的标准属性定义之后, 接下来就是定义标准的Handler处理程序, 其中包含控件属性映射器及构造函数, 如下所示:

partial class MyProgressBarHandler{public static PropertyMapper<MyProgressBar, MyProgressBarHandler> HorizontalProgressBarMapper = new(ViewHandler.ViewMapper){[nameof(MyProgressBar.Value)] = MapValue,[nameof(MyProgressBar.Foreground)] = MapForeground, [nameof(MyProgressBar.Indeterminate)]= MapIndeterminate};public MyProgressBarHandler(PropertyMapper mapper): base(mapper){}public MyProgressBarHandler() : base(HorizontalProgressBarMapper){}}

3.第三步(创建平台处理程序)
在属性映射器中, 我们可以很轻松看见对应了三个属性的事件处理程序, 但是目前并没有定义它, 这意味着你需要在不同平台下分别实现对应的
三个事件处理程序, 所以很快阿, 赶紧在Platforms > Android > Controls 下定义了一个MyProgressBarHandler, 如下所示:
40fd75a2f6d269454558fd48a583cd8e.png

接着继承于ViewHandler并且与原生安卓ProgressBar关联。

using Android.Widget;partial class MyProgressBarHandler :ViewHandler<MyProgressBar, ProgressBar>{ }

重写CreateNativeView(这是创建本地控件最开始的地方)

protected override ProgressBar CreateNativeView(){return new ProgressBar(Context, null,  Android.Resource.Attribute.ProgressBarStyleHorizontal){Indeterminate = true,Max = 10000,}; }

紧接着, 实现三个事件处理程序方法, MapValue、MapForeground、MapIndeterminate

static void MapValue(MyProgressBarHandler handler, MyProgressBar view){var nativeView= handler?.NativeView;nativeView.Progress = (int)(view.Value * Max);}static void MapForeground(MyProgressBarHandler handler, MyProgressBar view){UpdateForeground(handler?.NativeView, view.Foreground);static void UpdateForeground(ProgressBar nativeProgressBar, Color color){if (color == null){(nativeProgressBar.Indeterminate ? nativeProgressBar.IndeterminateDrawable :nativeProgressBar.ProgressDrawable)?.ClearColorFilter();}else{var tintList = ColorStateList.ValueOf(color.ToNative());if (nativeProgressBar.Indeterminate)nativeProgressBar.IndeterminateTintList = tintList;elsenativeProgressBar.ProgressTintList = tintList;}}}static void MapIndeterminate(MyProgressBarHandler handler, MyProgressBar view){var nativeView= handler?.NativeView;nativeView.Indeterminate = view.Indeterminate;}

4. 对应的实现iOS平台的Handler事件处理程序, 与上步骤相同, 对于事件的处理细节则对应不同平台的逻辑处理。

partial class MyProgressBarHandler :ViewHandler<MyProgressBar, UIProgressView>{protected override UIProgressView CreateNativeView()
{return new UIProgressView(UIProgressViewStyle.Default);}static void MapValue(MyProgressBarHandler handler, MyProgressBar view)
{var nativeView = handler.NativeView;nativeView.Progress = (float)view.Value;}static void MapForeground(MyProgressBarHandler handler, MyProgressBar view)
{var nativeView = handler.NativeView;nativeView.ProgressTintColor = view.Foreground?.ToNative();} static void MapIndeterminate(MyProgressBarHandler handler, MyProgressBar view)
{//...}}

5.打开MauiProgram文件, 添加AddHandler

public static MauiApp CreateMauiApp(){var builder = MauiApp.CreateBuilder();builder.UseMauiApp<App>().ConfigureFonts(fonts =>{fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");}).ConfigureMauiHandlers(handler =>{handler.AddHandler(typeof(MyProgressBar), typeof(MyProgressBarHandler));});  return builder.Build();}

6.界面中,分别声明MAUI原生控件与自定义控件

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="MAUIRender.MainPage"xmlns:my="clr-namespace:MAUIRender" xmlns:ctor="clr-namespace:MAUIRender.Controls" BackgroundColor="{DynamicResource SecondaryColor}"><Grid><StackLayout><ProgressBar   Progress="30" ProgressColor="Red"/><ctor:MyProgressBar Indeterminate="True"Value="600"  Foreground="Green" /></StackLayout></Grid>
</ContentPage>

运行实际效果:
1b643e4c81adbe449a49c6acfc77d904.gif

总结

通过利用Handler来处理不同平台控件的行为, 与控件本身解耦并且更加容器支持更多的平台。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之android studio如何获取证书指纹 (SHA1)

android studio如何获取证书指纹 (SHA1) 为什么要用SHA1 我们做百度地图或是高德地图的时候。注册app信息要求填写数字签名 我们可以通过外部命令行获取&#xff0c;也可以通过eclipse获取 &#xff0c;现在主流是android studio下面是通过Android studio获取的方法 第一步&am…

排位重要还是媳妇儿重要?

1 刚打到的车&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 还是排位要紧&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 大叔为求省事在家自行焚烧床垫▼4 好家伙&#xff0c;这回答直呼&#xff1a;想不到吧&#xff01;&#xff08;素材来源网络&…

新天龙八部服务器维护了吗,《新天龙八部》3月11日全服更新维护公告

亲爱的玩家&#xff0c;大家好&#xff1a;为保证游戏运行的稳定性&#xff0c;提升整体服务质量&#xff0c;《新天龙八部》游戏全部服务器(除测试服务器外)将于2021年3月11日7&#xff1a;00—9&#xff1a;00进行更新维护&#xff0c;维护后版本号升级为3.67.9108。如果在预…

锁屏快捷键_全面屏 iPhone 锁屏快捷键美化,让你的 iPhone 更特别

苹果从iPhone X以后的手机都是全面屏(即刘海屏)&#xff0c;在你的全面屏手机锁屏状态在&#xff0c;屏幕下方有两个快捷按钮&#xff0c;左边的是「手电筒」&#xff0c;右边的是「相机」&#xff0c;在锁屏状态下这两个功能是圆形的&#xff0c;今天堂堂分享一个无需越狱即可…

URLEncode编码和URLDecode解码

1 String text1 java.net.URLEncoder.encode("中国" ,"utf-8" ); 2 String text2 java.net.URLDecoder.decode(text1,"utf-8"); (1).URLEncoder需要注意&#xff1a;这个方法编码了符号&#xff0c;“\” ,“&”,“”,和“&#xff1…

MAUI 移植 Xamarin.Forms 自定义渲染器

简介众所周知, .NET MAUI使用的是Handler处理程序, 而Xamarin使用的则是Render渲染器模式。尽管MAUI中使用了新的渲染模式, 但是仍然Xamarin中的支持Render渲染器, 这意味着如果你的项目是从Xamarin移植到MAUI当中, 大部分代码能够可以重用, 本篇文章介绍如何将Xamarin 渲染器(…

当下流行的分布式文件系统大阅兵

本文对目前数种分布式文件系统进行简单的介绍。当前比较流行的分布式文件系统包括&#xff1a;Lustre、Hadoop、MogileFS、FreeNAS、FastDFS、NFS、OpenAFS、MooseFS、pNFS、以及GoogleFS。Lustre&#xff08;www.lustre.org&#xff09;lustre是一个大规模的、安全可靠的&…

栈和队列之LinekedList(双端队列)

介绍: ( deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。 双端队列是限定插入和删除操作在表的两端进行的线性表。这两端分别称做端点1和端点2(如下图(a)所示)。也可像栈一样,…

python全局变量操作详解_Python全局变量操作详解

接触Python时间不长&#xff0c;对有些知识点&#xff0c;掌握的不是很扎实&#xff0c;我个人比较崇尚不管学习什么东西&#xff0c;首先一定回去把基础打的非常扎实了&#xff0c;再往高处走。今天遇到了Python中的全局变量的相关操作&#xff0c;遇到了问题&#xff0c;所以…

酒桌上,领导将酒泼到你脸上......

1 哈尔滨的冬天能有多冷&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 复刻经典&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 从泥浆里出来的老虎▼4 让你再吵&#xff01;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼5 酒桌上&#…

机房网络服务器维修图片,机房机柜尾纤布线图片 机房布线维护整理

原标题&#xff1a;机房机柜尾纤布线图片 机房布线维护整理评价一个工人的机柜布线水平&#xff0c;总的来说还是主要看他打标签的熟练度、重视度、清晰度、整洁度。工具&#xff1a;理线夹&#xff0c;理线器&#xff0c;理线架&#xff0c;桥架固定器&#xff0c;线卡&#x…

在宽字节环境下获取EditBox中的CString转换为char[]

2019独角兽企业重金招聘Python工程师标准>>> 用多字节编码的话可以试试这个 char temp[4]; CString str _T("23"); char* pchar str.GetBuffer(0); strcpy(temp,pchar); 如果是unicode编码的话,用这个 char temp[4]; CString str _T("23"…

Rider 2021.3 Beta 现已推出

Rider 2021.3 是今年的最后一个版本, 现在已经推出了 Beta 版, 你现在可以在 jetbrains 官网下载&#xff0c;这个版本也是免费使用的, 不需要许可证&#xff0c;以下是本次更新的主要内容&#xff1a;1. 支持 .NET 6 SDK, 包括 Hot Reload。2. 完全重新设计的主工具栏3. 调…

eclipse各种配置

2019独角兽企业重金招聘Python工程师标准>>> * eclipse配置tomcat运行内存&#xff0c;在配置后追加&#xff1a; -Xmx512m -XX:PermSize256m * eclipse自身内存配置&#xff0c;eclipse.ini文件追加&#xff1a; -Xms512m -Xmx1024m -XX:PermSize512M -XX:MaxPerm…

Android之如何设置背景的透明度

半透明<Button android:background"#e0000000" ... /> 透明<Button android:background"#00000000" ... /> 颜色和不透明度 (alpha) 值以十六进制表示法表示。任何一种颜色的值范围都是 0 到 255&#xff08;00 到 ff&#xff09;。对于 alpha…

python怎么使用time模块_PYTHON的TIME模块使用

1.在Python中&#xff0c;通常有这几种方式来表示时间&#xff1a;1)时间戳2)格式化的时间字符串3)元组(struct_time)共九个元素。由于Python的time模块实现主要调用C库&#xff0c;所以各个平台可能有所不同。2.UTC(CoordinatedUniversalTime&#xff0c;世界协调时)亦即格林威…

数组的几种排序算法的实现(1)

数据结构中的排序算法,各有用处,比如: 1,直接插入排序,在序列基本有序的情况下,移动的次数比较少,但是比较次数是一样的 复杂度O(n*n); 2,冒泡排序,这个不用说了吧,刚学C的人都懂了 3,希尔排序,只要是找出较好的增量,将数据排列成基本有序时,最后一次来一次直接插入排序,是对直…

才貌双全,既是学霸,又是运动达人,这个博士小姐姐太飒了

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;募格学术唐文静&#xff0c;天津大学化工学院 2017级博士生&#xff0c;中共党员&#xff0c;天津大学长跑队队员。自博士入学之至今&#xff0c;以一作发表高水平学术论文2篇&#xff1a;Advanced Energy Materials…

TFS 2012研发管理能力(9)

转载于:https://blog.51cto.com/8382359/1342246

MAUI安卓子系统调试方法(附安装教程)

介绍本文主要介绍Windows 11操作系统下, 如何安装安卓子系统并且使用Visual Studio 2022 调试MAUI项目, 主要通过adb的方式与连接至安卓子系统。说明:1.关于如何使用Visual Studio 2019/2022 启用adb调试Xamarin安卓项目, 查看往期: https://www.cnblogs.com/zh7791/p/13863677…