为了能够创建需要在Xamarin环境中本机完成的样式,我使用的是自定义渲染器 . 在android方面,我收到 System.InvalidCastException
,我不知道如何解决这个问题 . 我正在包装 Android.Widget.StackView
由于this guys建议我之前得到的错误(没有默认构造函数接受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
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.Registrar1 [TRegistrable] .GetHandler [TOut](System.Type type)[0x00000]在C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Core \ Registrar . cs:29位于C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ Platform.cs:281 at的Xamarin.Forms.Platform.Android.Platform.CreateRenderer(Xamarin.Forms.VisualElement element)[0x00006] 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 at Xamarin.Forms.Platform.Android.VisualElementPackager.SetElement(Xamarin.Forms.Visual)元素oldElement,Xamarin.Forms.VisualElement newElement)[0x00104]在C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ VisualElementPackager.cs:204 at Xamarin.Forms.Platform.Android.VisualElementPackager.Load() [0x00000]位于C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ VisualElementPackager.cs:56,位于Xamarin.Forms.Platform.Android.VisualElementRenderer1 [TElement] .SetPackager(Xamarin.Forms.Platform.Android . VisualElementPackager packager)[0x00007]在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.VisualElementRenderer1 [TElement] .Xamarin.Forms . Platform.Android.IVisualElementRenderer.SetElement(Xamarin.Forms.VisualElement元素) [0x00027]在X:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ VisualElementRenderer.cs:128中的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]在C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ VisualElementPackager.cs:72 at Xamarin.Forms.Platform.Android.VisualElementPackager.SetElement(Xamarin . 在Xamarin.Forms.Platform.Android.VisualElementPackager.Load的C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ VisualElementPackager.cs:204中的Forms.VisualElement oldElement,Xamarin.Forms.VisualElement newElement)[0x00104] ()[0x00000]在C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms中.Platform.Android \ VisualElementPackager.cs:56位于C:\ BuildAgent2 \ work \ aad494dc9bc9783中的Xamarin.Forms.Platform.Android.VisualElementRenderer1 [TElement] .SetPackager(Xamarin.Forms.Platform.Android.VisualElementPackager packager)[0x00007] Xamarin.Forms.Platform.Android \ VisualElementRenderer.cs:327在C:\ BuildAgent2 \ work中的Xamarin.Forms.Platform.Android.VisualElementRenderer1 [TElement] .SetElement(Xamarin.Forms.Platform.Android.TElement element)[0x00111] \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ VisualElementRenderer.cs:195 at Xamarin.Forms.Platform.Android.VisualElementRenderer1 [TElement] .Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement(Xamarin.Forms.VisualElement element)[0x00027]在X:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ VisualElementRenderer.cs:128中的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.Platform.AddChild(Xamarin.Forms.VisualElement view,Boolean layout)[0x00015] in C :\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ Platform.cs:518,位于C:\ BuildAgent2中的Xamarin.Forms.Platform.Android.Platform.SetPage(Xamarin.Forms.Page newRoot)[0x00089] work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ Platform.cs:406 at Xamarin.Forms.Platform.Android.FormsApplicationActivity.InternalSetPage(Xamarin.Forms.Page page)[0x000b7] in C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ FormsApplicationActivity.cs:286在C:\ BuildAgent2 \ work \ aad4中的Xamarin.Forms.Platform.Android.FormsApplicationActivity.SetMainPage()[0x00000] 94dc9bc9783 \ Xamarin.Forms.Platform.Android \ FormsApplicationActivity.cs:305在C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin中的Xamarin.Forms.Platform.Android.FormsApplicationActivity.LoadApplication(Xamarin.Forms.Application应用程序)[0x0002d] . 在/Users/ryan/project-app-xamarin/Project/Project.Droid/MainActivity中的Project.Droid.MainActivity.OnCreate(Android.OS.Bundle包)[0x000ae]中的Forms.Platform.Android \ FormsApplicationActivity.cs:108 . cs:47在Android.App.Activity.n_OnCreate_Landroid_os_Bundle_(IntPtr jnienv,IntPtr native__this,IntPtr native_savedInstanceState)[0x00011] /Users/builder/data/lanes/3340/4e275588/source/monodroid/src/Mono.Android/platforms/ android-23 / src / generated / Android.App.Activity.cs:2426 at at(wrapper dynamic-method)System.Object:688deba4-7150-4f17-9062-10e53a94164c(intptr,intptr,intptr)
1 回答
不确定这是否真的是你的问题的根源,但如果不是,它肯定会导致你的问题 .
在
RendererView
中,所有绑定属性都应将其declaringType
设置为声明它们的类,即RendererView
.例如,您的第一个绑定属性应如下所示:
然后对所有其他人做同样的事情 . 如果这不能解决问题,请务必告诉我 .
编辑:根据下面的OP评论,初始错误来自
ExportRenderer
行,需要声明RendererView
而不是stackViewWrapper
,如下所示: