.NET Maui 自定义处理程序将参数从 xaml 代码传递到处理程序代码?

Posted

技术标签:

【中文标题】.NET Maui 自定义处理程序将参数从 xaml 代码传递到处理程序代码?【英文标题】:.NET Maui Custom Handler pass parameters from xaml code to handler code? 【发布时间】:2022-01-12 01:58:49 【问题描述】:

我有一个 .Net MAUI 应用程序。它有一个页面,我在其中使用一些自定义处理程序(类似于自定义渲染器)作为我的控件。例如,我有一个标签被一些代码覆盖以在其周围创建边框:

    Microsoft.Maui.Handlers.LabelHandler.LabelMapper.AppendToMapping(nameof(IView.Background), (handler, view) =>
            
                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 代码中使用它的方式:

 <customHandler:CustomHandlerLabelPriceTag 
        Text="Binding text" FontSize="15" 
        Padding="9,0,9,0" TextColor="StaticResource ColorText" 
        HorizontalOptions="CenterAndExpand" 
        VerticalOptions="Center" HorizontalTextAlignment="Center" 
        VerticalTextAlignment="Center"/>

我的问题:我希望能够将上面 XAML 代码中的字符串(通过将其绑定到我已经拥有的字符串,即使用 Binding ...)传递给自定义处理程序,该字符串将用于在自定义处理程序代码中设置边框颜色。我只需要知道如何传递该值,其余的我可以自己解决;)这可能吗?

谢谢!

【问题讨论】:

【参考方案1】:

基本上,您需要在自定义控件上自定义 BindableProperty。然后处理程序可以访问该属性。

此答案显示Xamarin Forms 代码。应该很容易适应MAUIHandler。

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 后面的代码中,所以“Source”是“this”:

<customHandler:CustomHandlerLabelPriceTag MyString=Binding MySpecialString, Source=x:Reference this ... />

在自定义渲染器中(希望在 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;


UPDATE - 对于 MAUI 处理程序(基于以下评论):

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

【讨论】:

是的,这有效,但处理程序略有不同。没错:string PassedColorParameter = ((CustomHandlerLabelPriceTag)view).MyString;

以上是关于.NET Maui 自定义处理程序将参数从 xaml 代码传递到处理程序代码?的主要内容,如果未能解决你的问题,请参考以下文章

MAUI自定义 .NET MAUI XAML 页面中的布局

MAUI自定义 .NET MAUI XAML 页面中的布局

.net maui 中的自定义控件和渲染器会发生啥?

MAUI 移植 Xamarin.Forms 自定义渲染器

在 .NET MAUI 中如何更好地自定义控件

MAUI 入门教程系列(3.多目标平台)