日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/4 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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, 如下所示:

接著繼承于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>

運行實際效果:

總結

通過利用Handler來處理不同平臺控件的行為, 與控件本身解耦并且更加容器支持更多的平臺。

總結

以上是生活随笔為你收集整理的MAUI中构建跨平台原生控件实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精选久久 | 免费在线小视频 | 日本不卡一区二区在线观看 | 日韩高清三区 | 国内激情视频 | 九九热播视频 | 成人免费a级片 | av观看一区| 精品视频免费播放 | 91在线第一页 | 亚洲色图40p | 国产白丝袜美女久久久久 | 黄色不卡av| 黄页视频在线免费观看 | 久久情趣视频 | 欧美不卡在线观看 | 一道本在线播放 | 极品销魂美女一区二区三区 | 欧美日韩精品免费 | av每日更新在线观看 | 欧美日韩一区二区三区在线视频 | 精品在线看 | av中文字幕免费在线观看 | 欧美又粗又长又爽做受 | 人妻无码中文久久久久专区 | 麻豆91网站 | 国产成人精品一区二区三区福利 | 欧美日韩国产亚洲沙发 | 91蜜臀精品国产自偷在线 | 美女黄色一级片 | 欧美特级a | 亚洲熟女乱综合一区二区三区 | 三大队在线观看 | 在线视频国产一区 | 亚洲天堂视频一区 | 亚洲一区二区三区四区视频 | 成人性视频网 | 嫩草影院在线免费观看 | 亚洲熟伦熟女新五十路熟妇 | 婷婷日 | 免费av不卡 | 免费黄色视屏 | 91黄色国产 | 青青青在线观看视频 | 日韩avxxx | 久久久国产亚洲 | 国产福利精品在线观看 | 日本色呦呦 | 草逼免费视频 | 欧美视频综合 | 美女脱了裤子让男人桶 | 久久久99久久| 一区二区欧美精品 | 成人三级在线视频 | 成人一级生活片 | 久久久久国产精品一区 | 日韩av图片 | 欧美精品久久久久久 | 婷婷丁香一区二区三区 | 久久a级片 | 午夜免费一区 | 欧美在线观看成人 | 毛片久久久久 | 光溜溜视频素材大全美女 | 在线播放视频高清在线观看 | 伊人网视频在线观看 | 日本精品免费一区二区三区 | 波多野吉衣在线视频 | 中文字幕3页 | 久久久三级 | 久久久久久久亚洲 | 久久精品人妻av一区二区三区 | 日韩激情在线视频 | 青青青免费在线 | 日韩福利网 | 日本黄色视屏 | www国产精品 | 精品人妻一区二区三区日产乱码 | 天堂av观看 | 天天躁日日躁狠狠躁av麻豆男男 | 中文在线免费观看 | 老司机成人网 | 人妻一区二区三区四区 | 小辣椒导航| 国产激情对白 | 日韩黄色在线观看 | 日韩av免费 | 欧美黄网站在线观看 | 综合五月激情 | 国产叼嘿视频在线观看 | 亚洲成人网页 | 九九九九久久久久 | 成人免费毛片嘿嘿连载视频 | 爱看av| 国产亚洲一区二区三区四区 | 免费成人深夜夜行网站视频 | 九九热视频这里只有精品 | 日韩视频一区二区三区四区 | 国产欧美精品久久 |