无法从视图中检索自定义控件值

Unable To Retrieve Custom Control Value from View

不幸的是,我没有足够高的代表来评论任何人 post。

我正在尝试一些事情并遇到了 post 链接,这让我在尝试其他 post 之后非常接近解决方案。我还尝试在应用程序中自动调整文本大小,但在 MVVM Master Detail 项目中。如果我直接在 Droid 渲染器中输入值,它会按预期工作,但是当我拥有所需的所有大小的字体时,这就达不到目的了。

我没有从视图中收到任何值。我假设尚未创建视图,但背后的代码已初始化。我很确定我所做的一切基本上都是正确的,但我主要处理股票 Xamarin,因此扩展功能对我来说仍然很新鲜。感谢所有帮助。

自定义控件(编辑:将默认值从 default(int) 更改为整数值以消除异常)

/// <summary>Auto scale label font size class.</summary>
public class AutoSizeLabel : Label
{
    /// <summary>Minimum font size property.</summary>
    public static readonly BindableProperty MinimumFontSizeProperty = BindableProperty.Create(
        propertyName: nameof(MinimumFontSize),
        returnType: typeof(int),
        declaringType: typeof(AutoSizeLabel),
        defaultValue: 17);

    /// <summary>Maximum font size property.</summary>
    public static readonly BindableProperty MaximumFontSizeProperty = BindableProperty.Create(
        propertyName: nameof(MaximumFontSize),
        returnType: typeof(int),
        declaringType: typeof(AutoSizeLabel),
        defaultValue: 24);

    /// <summary>Gets or sets minimum font size.</summary>
    public int MinimumFontSize
    {
        get
        {
            return (int)this.GetValue(MinimumFontSizeProperty);
        }

        set
        {
            this.SetValue(MinimumFontSizeProperty, value);
        }
    }

    /// <summary>Gets or sets maximum font size.</summary>
    public int MaximumFontSize
    {
        get
        {
            return (int)this.GetValue(MaximumFontSizeProperty);
        }

        set
        {
            this.SetValue(MaximumFontSizeProperty, value);
        }
    }
}

Droid 渲染器

public class AutoSizeLabelRenderer : LabelRenderer
{

    protected override bool ManageNativeControlLifetime => false;

    protected override void Dispose(bool disposing)
    {
        Control.RemoveFromParent();
        base.Dispose(disposing);
    }

    private AutoSizeLabel bindingValue = new AutoSizeLabel();

    private AppCompatTextView appCompatTextView;

    public AutoSizeLabelRenderer(Context context) : base(context)
    {
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement == null || !(e.NewElement is AutoSizeLabel autoLabel) || Control == null) { return; }

        //v8 and above supported natively, no need for the extra stuff below.
        if (DeviceInfo.Version.Major >= 8)
        {
            Control?.SetAutoSizeTextTypeUniformWithConfiguration(bindingValue.MinimumFontSize, bindingValue.MaximumFontSize, 2, (int)ComplexUnitType.Sp);
            return;
        }
        appCompatTextView = new AppCompatTextView(Context);
        appCompatTextView.SetTextColor(Element.TextColor.ToAndroid());
        appCompatTextView.SetMaxLines(1);
        appCompatTextView.SetBindingContext(autoLabel.BindingContext);SetNativeControl(appCompatTextView);

        TextViewCompat.SetAutoSizeTextTypeUniformWithConfiguration(Control, bindingValue.MinimumFontSize, bindingValue.MaximumFontSize, 2, (int)ComplexUnitType.Sp);
    }
}

XAML 通话

                <renderer:AutoSizeLabel MinimumFontSize="17"
                                    MaximumFontSize="24"
                                    Style="{StaticResource SomeStyle}"
                                    Text="{Binding SomeText}">
                <Label.GestureRecognizers>
                    <TapGestureRecognizer Command="{Binding SomeCommand}"></TapGestureRecognizer>
                </Label.GestureRecognizers>
            </renderer:AutoSizeLabel>

这一行是不必要的。

private AutoSizeLabel bindingValue = new AutoSizeLabel();

改为引用 autoLabel。或者我将支票更改为

if (e.NewElement == null || Control == null) { return; }

并在下一行使用

var autoSizeLabel = e.NewElement as AutoSizeLabel;