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

简介

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

先决条件

为了还原本次测试环境, 下面说明了本次测试的开发环境, 如下:

IDE: Visual Studio Community 2022 Preview (64 位) 17.0.0 Preview 7.0
操作系统: Windows 11家庭版 已安装Andoroid子系统(调试使用)
IDE 模块:安装Xamarin移动端开发环境及MAUI预览版环境

创建Xamarin渲染器

  • 第一步: 首先创建一个Xamarin.Forms项目, 在Android项目中创建CustomRender文件夹, 并且创建自定义渲染器MyButtonRender, 如下所示:
    c071eb1a98ee97642050bfb6e06f755f.png

说明: MyButtonRender类完整代码如下所示:

using Android.Content; 
using App2.Droid.CustomRender; 
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using App2;[assembly: ExportRenderer(typeof(MyButton), typeof(MyButtonRender))]
namespace App2.Droid.CustomRender
{public class MyButtonRender : ButtonRenderer{public MyButtonRender(Context context) : base(context){}protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e){base.OnElementChanged(e);if(Control!= null){Control.SetBackgroundColor(global::Android.Graphics.Color.Red);}}}
}
  • 第二步:在类库项目App2中添加MyButton类,继承Button, 如下所示:

using Xamarin.Forms;namespace App2
{public class MyButton : Button{}
}
  • 第三步:在Xaml中使用MyButton, 如下所示:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="App2.Views.AboutPage"xmlns:my="clr-namespace:App2" ><Grid><!--此处略过许多代码--><my:MyButton Text="About!" /></Grid>
</ContentPage>
  • 第四步:启动Android项目,预览效果,如下所示:
    8b511462ad9338c817716540708d5ba3.png

说明:通过上面几步, 我们轻松的完成了在Xamarin当中自定义渲染器并且显示在模拟器当中, 接下来, 主要的任务是将Xamarin现有的
自定义渲染器移植到MAUI项目中, 那么下面接着继续表演。

渲染器移植至MAUI项目

  • 第一步: 这里, 直接创建名为MAUIRender的新MAUI项目。
    e9b95dedfa0a67eb46d231d3f316598f.png

  • 第二步: 然后, 我们把Xamarin中创建的MyButton与MyButtonRender直接复制到MAUI的项目中, 如下所示:
    a6588ef8726860f3be99921e4f839109.png

MyButtonRender类修改如下:

using App2;
using Android.Content; 
using Microsoft.Maui.Controls.Platform;
using Microsoft.Maui.Controls;
using Microsoft.Maui.Controls.Compatibility.Platform.Android.FastRenderers;namespace MAUIRender
{public class MyButtonRender : ButtonRenderer{public MyButtonRender(Context context) : base(context){}protected override void OnElementChanged(ElementChangedEventArgs<Button> e){base.OnElementChanged(e);if(Control!= null)Control.SetBackgroundColor(global::Android.Graphics.Color.Red);}}
}

说明: 此处更新涉及更新命名空间引用

移除旧的Xamarin引用:
using Xamarin.Forms.Platform.Android;
using Xamarin.Forms;

添加新的MAUI引用:
using Microsoft.Maui.Controls;
using Microsoft.Maui.Controls.Platform;
using Microsoft.Maui.Controls.Compatibility.Platform.Android.AppCompat;

移除 [assembly: ExportRenderer(typeof(MyButton), typeof(MyButtonRender))] (原因下面说)

MyButton类修改如下:

using Microsoft.Maui.Controls;namespace App2
{public class MyButton : Button{}
}

说明: using Xamarin.Forms; 更新为: using Microsoft.Maui.Controls;

  • 第三步: 依赖注入自定义的Render
    上面所讲到移除 [assembly: ExportRenderer(typeof(MyButton), typeof(MyButtonRender))] 声明,
    在Xamarin当中, 渲染器强制声明在Android项目中, 耦合性很强。这一点,在MAUI项目当中, 则是通过Startup类中依赖注入的形式添加,通过扩展方法 ConfigureMauiHandlers 添加 AddCompatibilityRenderer,如下所示:

public static MauiApp CreateMauiApp(){var builder = MauiApp.CreateBuilder();builder.UseMauiApp<App>().ConfigureFonts(fonts =>{fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");}).ConfigureMauiHandlers(handler =>{#if ANDROIDhandler.AddCompatibilityRenderer(typeof(MyButton), typeof(MyButtonRender));#endif});return builder.Build();}

说明: 之所以使用ANDROID 条件, 取决于我们并为定义IOS平台的自定义渲染器, 当然我们可以这么做, 如果当该渲染器仅仅为Android提供, 我们即可单独设置。

  • 第四步: XAML页面中添加MyButton命名空间, 声明MyBuToon, 如下所示:

<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"BackgroundColor="{DynamicResource SecondaryColor}"><Grid><my:MyButton Text="Hello,MyButton!!!"HeightRequest="80"WidthRequest="300"HorizontalOptions="Center"/></Grid>
</ContentPage>

最终运行效果图,如下所示:
84a401cbf7c583e7f61e498591aec114.png

总结

这篇文章主要给大家介绍了如何将Xamarin Render移植到 .NET MAUI项目当中, 当然在新的MAUI当中,
仍然建议大家使用新的Handler处理程序来实现, 并且它提供了更好的性能以及灵活性。
下一篇, 主要给大家介绍, 如何在MAUI当中使用新的Handler体系来实现自定义平台控件。

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

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

相关文章

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

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

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

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…

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

全世界只有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…

Android之事件处理全面剖析

转载&#xff1a;http://blog.csdn.net/jxxfzgy/article/details/43926987 Android 事件处理机制说难也不难&#xff0c;说简单也不简单&#xff0c;为什么这么说呢&#xff1f;因为我相信大部分有了一定 Android 基础的同学&#xff0c;想要分析 Android 事件处理机制&#xf…

seata xid是什么_使用Seata彻底解决Spring Cloud中的分布式事务问题!

Seata是Alibaba开源的一款分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务&#xff0c;本文将通过一个简单的下单业务场景来对其用法进行详细介绍。什么是分布式事务问题&#xff1f;单体应用单体应用中&#xff0c;一个业务操作需要调用三个模块完…

基于netty的企业即时通讯系统的设计与实-离线消息处理

2019独角兽企业重金招聘Python工程师标准>>> 原文地址&#xff1a;http://www.cookqq.com/blog/8a10a5f35382ba2e0153c7a1125c20e7 客户端与服务器保持长连接&#xff0c;服务器可以很轻松的向客户端推送消息。由于网络不稳定、程序不可能24小时都被程序运行&…

GeneralUpdate实现应用程序更新

微软中国MSDN 点击上方蓝字关注我们大家好&#xff0c;我是本期的实验室研究员——朱震。今天我将通过实验和完整的操作过程&#xff0c;向大家介绍如何基于开源项目GeneralUpdate打造一个能自动升级的客户端应用。接下来就让我们一起到实验室中一探究竟吧&#xff01;微软MVP…

看完数学概念背后的故事,让孩子的数学兴趣激增1000倍!

▲ 点击查看英国著名科学家霍金在撰写《时间简史》的时候&#xff0c;出版商郑重其事地建议道&#xff1a;“你的书里多一条数学公式&#xff0c;就会失去一部分读者。”可见对数理化的害怕&#xff0c;也没有国界&#xff0c;大家都一样。看着满满都是概念和数字的课本&#x…

主存和cache每一块相等_笔记:cpu中的cache(一)

前言&#xff1a;绝大部分内容来源于北京大学的慕课《计算机组成原理》&#xff0c;地址&#xff1a;https://www.coursera.org/learn/jisuanji-zucheng存储体系&#xff08;《深入理解计算机系统》&#xff09;cache是为了解决cpu和内存速度不对等的问题。一&#xff0c;cache…

设计模式学习笔记(十七)——Command命令模式

设计模式学习笔记&#xff08;十七&#xff09;——Command命令模式 Command命令模式介绍&#xff1a; Command命令模式是一种对象行为型模式&#xff0c;它主要解决的问题是&#xff1a;在软件构建过程中&#xff0c;“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问…

MAUI中Maui.Graphics.Controls绘制控件

简介Microsoft.Maui.Graphics是一个完全采用C#的iOS&#xff0c;Android&#xff0c;Windows&#xff0c;macOS&#xff0c;Tizen和Linux的跨平台图形库。对于MAUI项目当中绘制的方案是使用不同平台的控件来而非自绘。当然MAUI当中也使用了Microsoft.Maui.Graphics,MAUI Previe…

BGP聚合as-set advertise-map

advertise-map xxx 用来挂汇总路由的&#xff0c;当route-map xxx 中的路由存在时&#xff0c;才会出现汇总路由。否则没有汇总路由只继承advertise-map xxx 中路由的属性当汇总路由携带了多个明细属性&#xff0c;可用advertise-map xxx 来移除某个明细路由的路由属性实验拓扑…

Android之如何解决popupWindow(pw.setFocusable(true))按返回键和menu键退出

先爆照: 问题: 使用过popupWindow的时候,我们为了让其它地方不可点击,我们一般会pw.setFocusable(true),但是当我们这样设置之后,问题出现了,按返回键或者menu菜单键没有反应,这是原因呢? PopupWindow 跟我们的 Activity 不一样,因为我们在构造 PW 的时候往往不是继…

上班骚扰男同事被抓到......

1 不同年代的辞职理由&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 月壤不能种菜太让人失望了▼3 原来&#xff0c;我也努力过▼4 忘了上班还有监控&#xff08;作者来源最右&#xff0c;ID&#xff1a;8943090 &#xff09;▼5 这是台风被黑的最惨的一次&…