Handler는 플랫폼 간 UI 컴포넌트(예: 버튼, 레이블)와 해당 컴포넌트의 네이티브 플랫폼 구현 사이의 매핑을 담당합니다.
예를 들어, MAUI의 Button은 iOS에서는 UIButton, Android에서는 Android.Widget.Button으로 구현됩니다.
Xamarin 에서 사용하던 Renderer 와 비슷합니다.
Renderer 는 각 기기 특성을 타는 부분을 각각의 Android, iOS 프로젝트에 네이티브 코드로 처리를 할수 있도록 합니다.
Xamarin 에서는 각 디바이스별로 Renderer 를 구현했지만
.NET MAUI Handler 는 이를 하나의 파일에서 처리 가능하도록 했습니다.
Android 에서 Entry 컨트롤에 언더라인이 생기게 되는데 이를 없애려면
Xamarin 에는 아래처럼 Renderer 를 이용해서 없애야했습니다.
Renderer 사용예시 (Android)
using Android.Content;
using Android.Graphics.Drawables;
using APP.Controls;
using APP.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(CustomEntry), typeof(CustomEntryRenderer))]
namespace APP.Droid.Renderers
{
public class CustomEntryRenderer : EntryRenderer
{
public CustomEntryRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
//Control.SetBackground(null);
}
if (Control != null)
{
GradientDrawable gd = new GradientDrawable();
gd.SetColor(global::Android.Graphics.Color.Transparent);
Control.SetBackground(gd);
}
}
}
}
하지만 Handler 를 이용하면 아래 처럼 간단하게 언더라인을 제거 할수 있습니다.
MauiProgram.cs
#if ANDROID
// Entry 에서 언더라인 제거
Microsoft.Maui.Handlers.EntryHandler.EntryMapper.AppendToMapping("NoUnderline", (h, v) =>
{
h.NativeView.BackgroundTintList = ColorStateList.ValueOf(Colors.Transparent.ToAndroid());
});
#endif
ButtonHandler 등등 각컨트롤에 대해서 처리가 가능하고 직접 만든 UserControl 도 지정이 가능합니다.
아래처럼 정의하고
public class MyButtonHandler : ButtonHandler
{
public MyButtonHandler() : base()
{
// 커스텀 초기화 코드
}
protected override void ConnectHandler(Android.Widget.Button nativeView)
{
base.ConnectHandler(nativeView);
// 네이티브 뷰에 대한 추가 설정
nativeView.SetBackgroundColor(Android.Graphics.Color.Red);
}
protected override void DisconnectHandler(Android.Widget.Button nativeView)
{
base.DisconnectHandler(nativeView);
// 연결 해제 시 필요한 정리 작업
}
}
만들어진 ButtonHandler 를 등록합니다.
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureMauiHandlers(handlers =>
{
handlers.AddHandler(typeof(Button), typeof(MyButtonHandler));
});
* 추가
Entry 의 글자 색을 기기별로 바꾸고 싶을때는 아래처럼 사용합니다.
// 기기에 따른 색상 변경
Microsoft.Maui.Handlers.EntryHandler.EntryMapper.AppendToMapping(nameof(IView.Background), (handler, view) =>
{
if (view is Entry)
{
#if ANDROID
handler.NativeView.SetTextColor(Colors.Red.ToNative());
#elif IOS
handler.NativeView.TextColor = Colors.Yellow.ToNative();
#elif WINDOWS
handler.NativeView.Foreground = Colors.Green.ToNative();
#endif
}
});
.NET MAUI MVVM 기본 처리 (0) | 2024.04.26 |
---|---|
.NET MAUI xaml 단에서 x:DataType 과 BindingContext 의 차이점 (0) | 2024.04.26 |
.NET MAUI x:Reference 사용하기 (0) | 2024.04.26 |
.NET MAUI x:static 사용하기 (0) | 2024.04.26 |
.NET MAUI Platform(Android/iOS)에 따라 처리하는 방법 (0) | 2024.04.26 |