Событие пользовательского рендерера Xamarin не запускается из TabbedPage - PullRequest
0 голосов
/ 13 февраля 2020

Я уже давно борюсь с проблемой, я довольно новичок в xamarin. У меня есть скрипт, содержащий несколько пользовательских визуализаторов. Мое первое событие нажатия Renderers работает отлично, но любое другое событие щелчка - нет, их даже не вызывают. Ниже приведен код моего скрипта Renderer

[assembly: ExportRenderer(typeof(CustomLogoutButton),typeof(CustomLogoutButtonRenderer))]
[assembly: ExportRenderer(typeof(CustomRoundButton), typeof(CustomRoundButtonRenderer))]
[assembly: ExportRenderer(typeof(CustomScanButton), typeof(CustomScanButtonRenderer))]
[assembly: ExportRenderer(typeof(CustomTransactionButton), typeof(CustomTransactionButtonRenderer))]
namespace VoucherSystemApp.Droid.CustomRenderClasses
{
public class CustomRoundButtonRenderer : ButtonRenderer
{
    public CustomRoundButtonRenderer(Context context)
        : base(context) { }


    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
    {
        base.OnElementChanged(e);

        var theButton = Control;

        if(theButton != null)
        {
            theButton.Background = Android.App.Application.Context.GetDrawable(Resource.Drawable.RoundCornerButton);

            theButton.Click += TheButton_Click;
        }
    }

    private void TheButton_Click(object sender, EventArgs e)
    {
        ((IButtonController)Element)?.SendClicked();
    }

    protected override void Dispose(bool disposing)
    {

        if(Control != null)
        {
            Control.Click -= TheButton_Click;
        }
        base.Dispose(disposing);
    }
}

public class CustomScanButtonRenderer : ButtonRenderer
{
    public CustomScanButtonRenderer(Context context)
        : base(context) { }

    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
    {
        base.OnElementChanged(e);

        var theButton = Control;

        if(theButton != null)
        {

            theButton.Background = Android.App.Application.Context.GetDrawable(Resource.Drawable.SemiRoundCornerButton);

            theButton.Click += TheButton_Click;
        }
    }

    private void TheButton_Click(object sender, EventArgs e)
    {
        ((IButtonController)Element)?.SendClicked();
    }

    protected override void Dispose(bool disposing)
    {

        if (Control != null)
        {
            Control.Click -= TheButton_Click;
        }
        base.Dispose(disposing);
    }
}

public class CustomTransactionButtonRenderer : ButtonRenderer
{
    public CustomTransactionButtonRenderer(Context context)
        : base(context) { }

    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
    {
        base.OnElementChanged(e);

        var theButton = Control;

        if (theButton != null)
        {
            theButton.Background = Android.App.Application.Context.GetDrawable(Resource.Drawable.TransactionsButton);

            theButton.Click += TheButton_Click;
        }
    }

    private void TheButton_Click(object sender, EventArgs e)
    {
        ((IButtonController)Element)?.SendClicked();
    }

    protected override void Dispose(bool disposing)
    {

        if (Control != null)
        {
            Control.Click -= TheButton_Click;
        }
        base.Dispose(disposing);
    }
}

public class CustomLogoutButtonRenderer : ButtonRenderer
{
    public CustomLogoutButtonRenderer(Context context)
        : base(context) { }

    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
    {
        base.OnElementChanged(e);

        var theButton = Control;

        if (theButton != null)
        {

            theButton.Background = Android.App.Application.Context.GetDrawable(Resource.Drawable.ProfileButton);


            theButton.Click += TheButton_Click;
        }


    }

    private void TheButton_Click(object sender, EventArgs e)
    {
        ((IButtonController)Element)?.SendClicked();
    }

    protected override void Dispose(bool disposing)
    {

        if (Control != null)
        {
            Control.Click -= TheButton_Click;
        }
        base.Dispose(disposing);
    }
}`

, а в моем коде TabbedPage я просто вызываю событие click как обычно, которое работало для моей первой кнопки, но не для других.

1 Ответ

0 голосов
/ 13 февраля 2020

Выяснилось, что во время ответа формы xamarin не нравятся, когда вы вкладываете элемент управления слишком глубоко (т. Е. В гнездо внутри гнезда и т. Д. c), и поэтому события не запускались. Я надеюсь, что это поможет кому-то в будущем!

...