Xamarin渲染器移植到.NET?MAUI項(xiàng)目中
簡介
眾所周知, .NET MAUI使用的是Handler處理程序, 而Xamarin使用的則是Render渲染器模式。盡管MAUI中使用了新的渲染模式, 但是仍然Xamarin中的支持Render渲染器, 這意味著如果你的項(xiàng)目是從Xamarin移植到MAUI當(dāng)中, 大部分代碼能夠可以重用, 本篇文章介紹如何將Xamarin 渲染器(Render)移植到.NET MAUI項(xiàng)目當(dāng)中。
先決條件
為了還原本次測試環(huán)境, 下面分別列舉了本次測試代碼移植的開發(fā)測試環(huán)境, 如下所示:
IDE: Visual Studio Community 2022 Preview (64 位) 17.0.0 Preview 7.0
操作系統(tǒng): Windows 11家庭版 已安裝Andoroid子系統(tǒng)(調(diào)試使用)
IDE:安裝Xamarin移動(dòng)端開發(fā)環(huán)境及MAUI預(yù)覽版環(huán)境
創(chuàng)建Xamarin渲染器
- 第一步: 首先創(chuàng)建一個(gè)Xamarin.Forms項(xiàng)目, 在Android項(xiàng)目中創(chuàng)建CustomRender文件夾, 并且創(chuàng)建自定義渲染器MyButtonRender, 如下所示:
說明: 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); } } } }
- 第二步:在類庫項(xiàng)目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>
- 第四步:啟動(dòng)Android項(xiàng)目,預(yù)覽效果,如下所示:
說明:通過上面幾步, 我們輕松的完成了在Xamarin當(dāng)中自定義渲染器并且顯示在模擬器當(dāng)中, 接下來, 主要的任務(wù)是將Xamarin現(xiàn)有的
自定義渲染器移植到MAUI項(xiàng)目中, 那么下面接著繼續(xù)表演。
渲染器移植至MAUI項(xiàng)目
第一步: 這里, 直接創(chuàng)建名為MAUIRender的新MAUI項(xiàng)目。
第二步: 然后, 我們把Xamarin中創(chuàng)建的MyButton與MyButtonRender直接復(fù)制到MAUI的項(xiàng)目中, 如下所示:
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當(dāng)中, 渲染器強(qiáng)制聲明在Android項(xiàng)目中, 耦合性很強(qiáng)。這一點(diǎn),在MAUI項(xiàng)目當(dāng)中, 則是通過Startup類中依賴注入的形式添加,通過擴(kuò)展方法 ConfigureMauiHandlers 添加 AddCompatibilityRenderer,如下所示:
public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); }) .ConfigureMauiHandlers(handler => { #if ANDROID handler.AddCompatibilityRenderer(typeof(MyButton), typeof(MyButtonRender)); #endif }); return builder.Build(); }
說明: 之所以使用ANDROID 條件, 取決于我們并為定義IOS平臺(tái)的自定義渲染器, 當(dāng)然我們可以這么做, 如果當(dāng)該渲染器僅僅為Android提供, 我們即可單獨(dú)設(shè)置。
- 第四步: 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>
最終運(yùn)行效果圖,如下所示:
總結(jié)
這篇文章主要給大家介紹了如何將Xamarin Render移植到 .NET MAUI項(xiàng)目當(dāng)中, 當(dāng)然在新的MAUI當(dāng)中,
仍然建議大家使用新的Handler處理程序來實(shí)現(xiàn), 并且它提供了更好的性能以及靈活性。
下一篇, 主要給大家介紹, 如何在MAUI當(dāng)中使用新的Handler體系來實(shí)現(xiàn)自定義平臺(tái)控件。
到此這篇關(guān)于Xamarin渲染器移植到.NET MAUI項(xiàng)目中的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net access添加返回自遞增id的實(shí)現(xiàn)方法
今天花了一點(diǎn)時(shí)間研究了這個(gè)問題,除此之外,還順帶研究了小孔子cms添加數(shù)據(jù)的過程,access添加返回自遞增id也是從小孔子cms中研究出來的。2008-08-08Ajax Throws Sys.WebForms.PageRequestManagerErrorException wi
注冊(cè)腳本: ScriptManager.RegisterStartupScript(this, typeof(string), "Message", "alert('error message');", true); 即可解決,困惑了我一下午。2008-11-11Asp.net MVC SignalR來做實(shí)時(shí)Web聊天實(shí)例代碼
本篇文章主要介紹了Asp.net SignalR來做實(shí)時(shí)Web聊天實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06ASP.Net Core基于EF6、Unitwork、Autofac實(shí)現(xiàn)Repository模式
這篇文章介紹了ASP.Net Core基于EF6、Unitwork、Autofac實(shí)現(xiàn)Repository模式的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02使用asp.net MVC4中的Bundle遇到的問題及解決辦法分享
這篇文章主要介紹了使用asp.net MVC4中的Bundle遇到的問題及解決辦法,需要的朋友可以參考下2014-02-02詳解.NET Core中的數(shù)據(jù)保護(hù)組件
在本篇文章中我們給大家整理了關(guān)于返回主頁.NET Core中的數(shù)據(jù)保護(hù)組件的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們參考下。2018-09-09ASP.net與SQLite數(shù)據(jù)庫通過js和ashx交互(連接和操作)
這篇文章主要介紹了ASP.net與SQLite數(shù)據(jù)庫通過js和ashx交互(連接和操作),具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01