недопустимое приведение отрисовщика xamarin

Чтобы иметь возможность создавать стили, которые должны выполняться изначально в среде Xamarin, я использую настраиваемое средство визуализации. Что касается Android, я получаю System.InvalidCastException и не знаю, как исправить эту проблему. В настоящее время я закрываю Android.Widget.StackView из-за этих парней предложение о предыдущей ошибке, которую я получал (конструктор по умолчанию не принимает ошибку 0 аргументов). Ошибка, похоже, возникает не из-за объявления или создания экземпляра, а, когда я добавляю ее в ContentView и происходит при возврате (обнаруживается путем комментирования строки, как показано ниже).

        MainPage = new ContentPage {
            Content = new StackLayout {
                VerticalOptions = LayoutOptions.Center,
                Children = {
                    item1,
                    item2,
                    item3,
                    item4,
                    item5,
                    item6,
                    //rendererIWantToAdd,//taking out this line make it work. adding it breaks it
                }
            }
        };

RendererView

RendererViewAndroid

public class RendererView :  View
{

    public static readonly BindableProperty ImageProperty = BindableProperty.Create(
        propertyName: "Src",
        returnType: typeof(string),
        declaringType: typeof(string),
        defaultValue: ""
    );
    public String Src
    {
        get { return (string)GetValue(ImageProperty); }
        set { SetValue(ImageProperty, value); }
    }

    public static readonly BindableProperty TextProperty = BindableProperty.Create(
        propertyName: "Text",
        returnType: typeof(string),
        declaringType: typeof(string),
        defaultValue: "Hello World"
    );
    public String Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly BindableProperty ColorProperty = BindableProperty.Create(
        propertyName: "Color",
        returnType: typeof(string),
        declaringType: typeof(string),
        defaultValue: "#AAAAAA"
    );
    public String Color
    {
        get { return (string) GetValue(ColorProperty); }
        set { SetValue(ColorProperty, value); }
    }
}

Трассировка стека ошибок

[assembly: ExportRenderer(typeof(Project.RendererView), typeof(stackViewWrapper))]
namespace Project.Droid
{
    public class RendererViewAndroid : ViewRenderer<RendererView, stackViewWrapper>
    {

        Android.Widget.TextView label;
        Android.Widget.ImageView image;

        protected override void OnElementChanged(ElementChangedEventArgs<RendererView> e)
        {
            base.OnElementChanged(e);
            if (Control == null)
            {
                createItem(e);
            }

            if (e.OldElement != null)
            {

                unsubscribe(e);
            }

            if (e.NewElement != null)
            {
                subscribe(e);
            }



        }


        protected void createItem(ElementChangedEventArgs<RendererView> e)
        {


            SetNativeControl(new stackViewWrapper());
            label = new Android.Widget.TextView(Context)
            {
                Text = Element.Text
            };

            image = new Android.Widget.ImageView(Context);
            if (!string.IsNullOrWhiteSpace(Element.Src))
            {
                Context.Resources.GetBitmapAsync(Element.Src).ContinueWith((t) =>
                {
                    var bitmap = t.Result;
                    if (bitmap != null)
                    {
                        image.SetImageBitmap(bitmap);
                        bitmap.Dispose();
                    }
                }, TaskScheduler.FromCurrentSynchronizationContext());

            }
            else {
            //  // clear the image
                image.SetImageBitmap(null);
            }


            Control.AddView(image);
            Control.AddView(label);



        }
        protected void subscribe(ElementChangedEventArgs<RendererView> e)
        {

        }
        protected void unsubscribe(ElementChangedEventArgs<RendererView> e)
        {

        }





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





    }


    public  class stackViewWrapper : Android.Views.View
    {
        public stackViewWrapper() : base(Android.App.Application.Context)
        {
        }
    }
}

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

Код


person R293    schedule 20.06.2016    source источник


Ответы (1)


В вашем RendererView для всех ваших свойств привязки должно быть declaringType установлено значение класса, в котором они объявляются, то есть RendererView.

Например, ваше первое свойство привязки должно выглядеть так:

Затем проделайте то же самое со всеми остальными. Если это не поможет, обязательно дайте мне знать.

public static readonly BindableProperty ImageProperty = BindableProperty.Create(
    propertyName: "Src",
    returnType: typeof(string),
    declaringType: typeof(RendererView),
    defaultValue: ""
);

Изменить: согласно комментарию OP ниже, первоначальная ошибка возникла из строки ExportRenderer, в которой необходимо было объявить RendererView вместо stackViewWrapper следующим образом:

К сожалению, это не устранило мою ошибку. Я определенно понимаю, как это могло впоследствии вызвать у меня ошибки. Мне интересно, не совпадают ли типы, которые я пытаюсь использовать. Например, я использую View с Android.Views.View. может они не совпадают по рендерерам? Кроме того, весь код в моем методе RendererView был закомментирован, но ошибки все еще отсутствуют. Это вся информация, которая у меня есть на данный момент.

[assembly: ExportRenderer(typeof(Project.RendererView), typeof(RendererViewAndroid))]
person hvaughan3    schedule 20.06.2016
comment
Ваш комментарий был почти в правильном направлении. Хотя на самом деле это была другая линия. In createItem() Первая показанная строка - это проблемы. Строка должна быть _2_, а не типом оболочки. Я позволю вам обновить свой ответ, чтобы сделать его наиболее полным (вместо того, чтобы делать его самостоятельно), и отмечу его как правильный. Большое спасибо! - person R293; 21.06.2016
comment
@ R293 Рад, что смог немного помочь. Отредактировал свой ответ, чтобы включить и ваш ответ. Спасибо за ответ с фактическим ответом на проблему. - person R293; 21.06.2016
comment
Худшие вещи, которые я всегда вижу, - это когда OP любого потока ошибок программы идет lol jk получил это и никогда не объясняет, как. Я бы предпочел не быть таким. - person hvaughan3; 21.06.2016
comment
@ R293 Ха-ха, полностью согласен - person R293; 21.06.2016
comment
System.InvalidCastException: указанное приведение недопустимо. at at (оболочка castclass) System.Object: __ castclass_with_cache (object, intptr, intptr) at Xamarin.Forms.Registrar_6_1 [TRegistrable] .GetHandler [TOut] (тип System.Type) [0x00000] в C: \ BuildAgent492 \ work \ a \ Xamarin.Forms.Core \ Registrar.cs: 29 в Xamarin.Forms.Platform.Android.Platform.CreateRenderer (элемент Xamarin.Forms.VisualElement) [0x00006] в C: \ BuildAgent2 \ work \ aad494dc9bormc9783 \ Xamarin.Flatform. .Android \ Platform.cs: 281 в Xamarin.Forms.Platform.Android.VisualElementPackager.AddChild (представление Xamarin.Forms.VisualElement, IVisualElementRenderer oldRenderer, Xamarin.Forms.Platform.Android.RenderenPool23, пул Same : \ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ VisualElementPackager.cs: 72 в Xamarin.Forms.Platform.Android.VisualElementPackager.SetElement (Xamarin.Forms.VisualleormElements. ] в C: \ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Andro id \ VisualElementPackager.cs: 204 в Xamarin.Forms.Platform.Android.VisualElementPackager.Load () [0x00000] в C: \ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ VisualElement. 56Packarin. Forms.Platform.Android.VisualElementRenderer_7_1 [TElement] .SetElement (элемент Xamarin.Forms.Platform.Android.TElement) [0x00111] в C: \ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Formments.Ristems.Platform в Xamarin.Forms.Platform.Android.VisualElementRenderer_8_1 [TElement] .SetPackager (Xamarin.Forms.Platform.Android.VisualElementPackager packager) [0x00007] в C: \ BuildAgent2 \ work \ aad494dc9bc97. cs: 327 в Xamarin.Forms.Platform.Android.VisualElementRenderer_9_1 [TElement] .Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00083sVisualElement element) [0x00083AgentAgent_C: .Forms.Platform.Android \ VisualElementRenderer.cs: 128 в Xamarin.Forms.Platform.Android.Platform.CreateRenderer (элемент Xamarin.Forms.VisualElement) [0x0001f] в C: \ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ Platform.cs: 282 at .Platform.Android.Platform.AddChild (представление Xamarin.Forms.VisualElement, логический макет) [0x00015] в C: \ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ Platform.cs: 518 в Xamarin. Forms.Platform.Android.Platform.SetPage (Xamarin.Forms.Page newRoot) [0x00089] в C: \ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ Platform.cs: 406 в Xamarin.Forms.Platform. Android.FormsApplicationActivity.InternalSetPage (страница Xamarin.Forms.Page) [0x000b7] в C: \ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ FormsApplicationActivity.cs: 286lic at Xamarin.Android. SetMainPage () [0x00000] в C: \ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ FormsApplicationActivity.cs: 305 в Xamarin.Forms.Platform.Android.FormsApplicationActivity.LoadApplication. 0x0002d] в C: \ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ FormsApplicationActivity.cs: 108 в Project.Droid.MainActivity.OnCreate (пакет Android.OS.Bundle) [0x000ae] в / Users / ryan / проект-приложение-xamarin / Project / Project.Droid / MainActivity.cs: 47 в Android.App.Activity.n_OnCreate_La ndroid_os_Bundle_ (IntPtr jnienv, IntPtr native__this, IntPtr native_savedInstanceState) [0x00011] в /Users/builder/data/lanes/3340/4e275588/source/monodroid/src/Mono.Android-23ndroids /. App.Activity.cs: 2426 at at (динамический метод оболочки) System.Object: 688deba4-7150-4f17-9062-10e53a94164c (intptr, intptr, intptr) - person hvaughan3; 21.06.2016