4

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
                }
            }
        };

コード

レンダラー ビュー

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); }
    }
}

RendererViewAndroid

[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)
        {
        }
    }
}

エラー スタック トレース

System.InvalidCastException: 指定されたキャストは無効です。at at (wrapper castclass) System.Object:__castclass_with_cache (object,intptr,intptr) at Xamarin.Forms.Registrar1[TRegistrable].GetHandler (System.Type type) [0x0001b] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Registrar.cs:24 at Xamarin.Forms.RegistrarXamarin.Forms.Platform.Android.Platform. Xamarin.Forms.Platform.Android.VisualElementPackager.AddChild (Xamarin. Forms.VisualElement ビュー、IVisualElementRenderer oldRenderer、Xamarin.Forms.Platform.Android.RendererPool プール、ブール値 sameChildren) [0x00023] C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:72 で Xamarin C の .Forms.Platform.Android.VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement、Xamarin.Forms.VisualElement newElement) [0x00104]:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:204 at Xamarin.Forms.Platform.Android.VisualElementPackager.Load () [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms .Platform.Android\VisualElementPackager.cs:56 at Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement].SetPackager (Xamarin.Forms.Platform.Android.VisualElementPackager packager) [0x00007] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:327 at Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement].SetElement (Xamarin.Forms.Platform.Android.TElement 要素) [0x00111] C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:195 at Xamarin.Forms.Platform .Android.VisualElementRenderer 1[TElement].Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00027] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:128 at Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x0001f] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\Platform.cs:282 at Xamarin.Forms.Platform.Android.VisualElementPackager.AddChild (Xamarin.Forms.VisualElement view, IVisualElementRenderer oldRenderer, Xamarin.Forms.Platform.Android.RendererPool pool, Boolean sameChildren) [0x00023] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:72 at Xamarin.Forms.Platform.Android.VisualElementPackager.SetElement (Xamarin.Forms.VisualElement oldElement, Xamarin.Forms.VisualElement newElement) [0x00104] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:204 at Xamarin.Forms.Platform.Android.VisualElementPackager.Load () [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\VisualElementPackager.cs:56 at Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement].SetPackager (Xamarin.Forms.Platform.Android.VisualElementPackager パッケージャー) [0x00007] C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:327 で Xamarin .Forms.Platform.Android.VisualElementRenderer1[TElement].SetElement (Xamarin.Forms.Platform.Android.TElement element) [0x00111] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:195 at Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement].Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement 要素) C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:128 の [0x00027] Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement 要素) [0x0001f] で C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\Platform.cs:282 で Xamarin.Forms .Platform.Android.Platform.AddChild (Xamarin.Forms.VisualElement view, Boolean layout) [0x00015] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\Platform.cs:518 at Xamarin.Forms. Xamarin.Forms.Platform.Android の C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\Platform.cs:406 の Platform.Android.Platform.SetPage (Xamarin.Forms.Page newRoot) [0x00089]。FormsApplicationActivity.InternalSetPage (Xamarin.Forms.Page ページ) [0x000b7] C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\FormsApplicationActivity.cs:286 at Xamarin.Forms.Platform.Android.FormsApplicationActivity.SetMainPage ( ) [0x00000] C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\FormsApplicationActivity.cs:305 で Xamarin.Forms.Platform.Android.FormsApplicationActivity.LoadApplication (Xamarin.Forms.Application アプリケーション) [0x0002d] C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.Android\FormsApplicationActivity.cs:108 で Project.Droid.MainActivity.OnCreate (Android.OS.Bundle バンドル) [0x000ae] で /Users/ryan/project- app-xamarin/Project/Project.Droid/MainActivity.cs:47 at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (IntPtr jnienv、IntPtr native__this、IntPtr native_savedInstanceState) [0x00011] in /Users/builder/data/lanes/3340/4e275588/source/monodroid/src/Mono.Android/platforms/android-23/src/generated/Android.App.Activity.cs:2426 でat (ラッパー動的メソッド) System.Object:688deba4-7150-4f17-9062-10e53a94164c (intptr,intptr,intptr)

4

1 に答える 1

1

これが実際に問題の原因であるかどうかはわかりませんが、そうでない場合は後で問題が発生することは間違いありません.

あなたのRendererViewすべてのバインディング プロパティは、declaringTypeそれらが宣言されているクラスに設定されている必要がありますRendererView

たとえば、最初のバインディング プロパティは次のようになります。

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

次に、残りのすべてについて同じことを行います。それでも解決しない場合は、必ずお知らせください。

編集:以下のOPのコメントによると、最初のエラーは次の行から発生したため、次のようExportRendererに宣言する必要がありました。RendererViewstackViewWrapper

[assembly: ExportRenderer(typeof(Project.RendererView), typeof(RendererViewAndroid))]
于 2016-06-20T20:01:40.563 に答える