Чтобы иметь возможность создавать стили, которые должны выполняться изначально в среде 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)
{
}
}
}
Не уверен, что это на самом деле корень вашей проблемы, но, если это не так, это наверняка вызовет у вас проблемы.
Код