網站首頁 編程語言 正文
簡介
眾所周知, .NET MAUI使用的是Handler處理程序, 而Xamarin使用的則是Render渲染器模式。盡管MAUI中使用了新的渲染模式, 但是仍然Xamarin中的支持Render渲染器, 這意味著如果你的項目是從Xamarin移植到MAUI當中, 大部分代碼能夠可以重用, 本篇文章介紹如何將Xamarin 渲染器(Render)移植到.NET MAUI項目當中。
先決條件
為了還原本次測試環(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)(調試使用)
IDE:安裝Xamarin移動端開發(fā)環(huán)境及MAUI預覽版環(huán)境
創(chuàng)建Xamarin渲染器
- 第一步: 首先創(chuàng)建一個Xamarin.Forms項目, 在Android項目中創(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); } } } }
- 第二步:在類庫項目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項目,預覽效果,如下所示:
說明:通過上面幾步, 我們輕松的完成了在Xamarin當中自定義渲染器并且顯示在模擬器當中, 接下來, 主要的任務是將Xamarin現(xiàn)有的
自定義渲染器移植到MAUI項目中, 那么下面接著繼續(xù)表演。
渲染器移植至MAUI項目
第一步: 這里, 直接創(chuàng)建名為MAUIRender的新MAUI項目。
第二步: 然后, 我們把Xamarin中創(chuàng)建的MyButton與MyButtonRender直接復制到MAUI的項目中, 如下所示:
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 ANDROID handler.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>
最終運行效果圖,如下所示:
總結
這篇文章主要給大家介紹了如何將Xamarin Render移植到 .NET MAUI項目當中, 當然在新的MAUI當中,
仍然建議大家使用新的Handler處理程序來實現(xiàn), 并且它提供了更好的性能以及靈活性。
下一篇, 主要給大家介紹, 如何在MAUI當中使用新的Handler體系來實現(xiàn)自定義平臺控件。
原文鏈接:https://www.cnblogs.com/zh7791/p/15591102.html
相關推薦
- 2023-03-28 python方法如何實現(xiàn)字符串反轉_python
- 2022-10-23 C/C++指針介紹與使用詳解_C 語言
- 2022-06-14 ASP.NET?Core?MVC中的布局(Layout)_基礎應用
- 2023-05-10 clickhouse系統(tǒng)表日志清理方式詳解_數(shù)據(jù)庫其它
- 2022-08-11 C#實現(xiàn)快速查詢文件的方法_C#教程
- 2022-04-15 golang數(shù)組和切片作為參數(shù)和返回值的實現(xiàn)_Golang
- 2023-10-15 獲取當天開始時間零點和結束時間24點的時間以及時間戳
- 2022-09-09 Nginx使用自簽ssl證書實現(xiàn)https連接的方法_nginx
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支