#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)). Моя струна;