Пользовательский обработчик .NET Maui передает параметры из кода xaml в код обработчика?

#c# #xamarin #xamarin.forms #maui

#c# #xamarin #xamarin.формы #мауи

Вопрос:

У меня есть приложение .NET MAUI. В нем есть страница, на которой я использую некоторые пользовательские обработчики (своего рода пользовательские визуализаторы) в качестве элементов управления. Например, у меня есть метка, которая перезаписана некоторым кодом для создания границы вокруг нее:

 Microsoft.Maui.Handlers.LabelHandler.LabelMapper.AppendToMapping(nameof(IView.Background), (handler, view) =gt;  {  if (view is CustomHandlerLabelPriceTag)  { #if __ANDROID__  handler.NativeView.SetBackgroundColor(Colors.Red.ToNative());   var gradientDrawable = new GradientDrawable();  gradientDrawable.SetCornerRadius(70f);  gradientDrawable.SetStroke(5, global::Android.Graphics.Color.ParseColor(SharedAppMethods.GetColorByKey("ColorPriceTag")));  gradientDrawable.SetColor(global::Android.Graphics.Color.ParseColor(SharedAppMethods.GetColorByKey("ColorBackground")));  handler.NativeView.SetBackgroundDrawable(gradientDrawable);   handler.NativeView.SetPadding(handler.NativeView.PaddingLeft, handler.NativeView.PaddingTop, handler.NativeView.PaddingRight, handler.NativeView.PaddingBottom); #elif __IOS__  handler.NativeView.BackgroundColor = Colors.Red.ToNative();  handler.NativeView.BorderStyle = UIKit.UITextBorderStyle.Line;   handler.NativeView.Layer.CornerRadius = 30;  handler.NativeView.Layer.BorderWidth = 3f;  handler.NativeView.Layer.BorderColor = Color.FromArgb(SharedAppMethods.GetColorByKey("ColorPriceTag")).ToCGColor();  handler.NativeView.Layer.BackgroundColor = Color.FromArgb(SharedAppMethods.GetColorByKey("ColorBackground")).ToCGColor();   handler.NativeView.LeftView = new UIKit.UIView(new CGRect(0, 0, 0, 0));  handler.NativeView.LeftViewMode = UIKit.UITextFieldViewMode.Always; #endif  }  

У него есть этот класс, здесь ничего особенного не нужно:

 using Microsoft.Maui.Controls;  namespace SheeperMAUI.CustomHandlers {  internal class CustomHandlerLabelPriceTag : Label  {  } }  

Вот как я использую его в коде XAML на своей странице:

 lt;customHandler:CustomHandlerLabelPriceTag   Text="{Binding text}" FontSize="15"   Padding="9,0,9,0" TextColor="{StaticResource ColorText}"   HorizontalOptions="CenterAndExpand"   VerticalOptions="Center" HorizontalTextAlignment="Center"   VerticalTextAlignment="Center"/gt;  

МОЙ ВОПРОС: я хочу передать строку в коде XAML выше (привязав ее к строке, которая у меня уже есть, т. Е. использование {Привязка …}) в пользовательский обработчик, где эта строка будет использоваться для задания цвета границы в коде пользовательского обработчика. Мне нужно только знать, как передать это значение, остальное я могу решить сам 😉 Возможно ли это?

Спасибо!

Ответ №1:

По сути, вам нужен BindableProperty пользователь в вашем пользовательском элементе управления. Затем обработчик может получить доступ к этому свойству.

В этом ответе показан Xamarin Forms код. Должно быть легко адаптироваться к MAUI обработчику.

В CustomHandlerLabelPriceTag.xaml.cs :

 public class CustomHandlerLabelPriceTag : Label {  // The property that will contain this special string.  public static readonly BindableProperty MyStringProperty =  BindableProperty.Create(nameof(MyString), typeof(string), typeof(MainPage), "");   public double MyString  {  get { return (double)GetValue(MyStringProperty); }  set { SetValue(MyStringProperty, value); }  } }  

Чтобы использовать это на странице, я назову это MyPage.xaml.cs :

 public string MySpecialString { get; set; }  

В MyPage.xaml , свяжите свой элемент управления MyString BindingContext с соответствующим свойством общедоступной строки. Здесь я предполагаю, что это MySpecialString так , и что это заложено в коде MyPage , поэтому «Источник» — это «это».:

 lt;customHandler:CustomHandlerLabelPriceTag MyString={Binding MySpecialString, Source={x:Reference this}} ... /gt;  

В пользовательском рендерере (надеюсь, аналогичном в обработчике MAUI):

 // In XF, `Element` is the XF view being rendered. if (Element != null) {  string specialString = Element.MyString;  // OR cast if necessary:  string specialString = ((CustomHandlerLabelPriceTag)Element).MyString; }  

ОБНОВЛЕНИЕ — Для обработчика MAUI (на основе комментария ниже):

 string PassedColorParameter = ((CustomHandlerLabelInfoCard)view).MyString;  

Комментарии:

1. Да, это сработало, хотя обработчик был немного другим. Это правильно: строка переданного цветового параметра = ((представление CustomHandlerLabelPriceTag)). Моя струна;