Здравствуйте. Я пытаюсь создать приложение с использованием форм Xamarin, которые содержат фрейм с изображением и записью внутри него.
Ниже мой XAML
<?xml version="1.0" encoding="utf-8"?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:SampleLoginRenderer"
x:Class="SampleLoginRenderer.SampleLoginRendererPage"
BackgroundColor="Blue">
<ContentPage.Content>
<Grid Grid.Row="3" Padding="0,10,0,0">
<local:MyFrame BackgroundColor="Red" OutlineColor="White" HasShadow="false" Padding="20,5,5,5" VerticalOptions="Center">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Source="nav_user.png" HeightRequest="20" WidthRequest="20" HorizontalOptions="Start" />
<local:MyEntry Placeholder="UserName / PhoneNo"
x:Name="EntryUserName"
BackgroundColor="White"
PlaceholderColor="White"
Grid.Column="1"
HorizontalOptions="FillAndExpand"
TextColor="White"
FontSize="15"
HeightRequest="40" />
</Grid>
</local:MyFrame>
</Grid>
</ContentPage.Content>
</ContentPage>
А затем у меня есть пользовательские средства визуализации для фрейма и записи в проектах iOS и Android.
Frame Renderers в Android Project:
Во-первых, я создал класс в проекте PCL,
using System;
using Xamarin.Forms;
namespace SampleLoginRenderer
{
public class MyFrame : Frame
{
}
}
И создал файл XML, (см. Ниже)
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke android:width="2.3dp" android:color="#ffffff"/>
<solid android:color="#00000000"/>
<corners android:radius="5dp" />
</shape>
Класс FrameRenderer в Android:
using Xamarin.Forms;
using System;
using Xamarin.Forms.Platform.Android;
using SampleLoginRenderer;
using SampleLoginRenderer.Android;
using Android.Content;
using Android.Graphics.Drawables;
using Android.Text;
using Android.Content.Res;
using SampleLoginRenderer.Droid;
using Android.Graphics;
[assembly: ExportRenderer(typeof(MyFrame), typeof(MyFrameRenderer))]
namespace SampleLoginRenderer.Droid
{
public class MyFrameRenderer : FrameRenderer
{
public MyFrameRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
{
base.OnElementChanged(e);
this.SetBackgroundResource(Resource.Drawable.blue_resct);
}
}
}
Frame Renderers в iOS:
Создать класс FrameRenderer
using Xamarin.Forms;
using System;
using SampleLoginRenderer;
using SampleLoginRenderer.iOS;
using Xamarin.Forms.Platform.iOS;
using CoreGraphics;
using UIKit;
[assembly: ExportRenderer(typeof(MyFrame), typeof(MyFrameRenderer))]
namespace SampleLoginRenderer.iOS
{
public class MyFrameRenderer : FrameRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
{
base.OnElementChanged(e);
this.Layer.CornerRadius = 18;
this.Layer.Bounds.Inset(1, 1);
Layer.BorderColor = UIColor.White.CGColor;
Layer.BorderWidth = 2;
Layer.BackgroundColor = Color.Transparent.ToCGColor();
}
}
}
Точно так же я создал Entry Renderers в проектах Android и iOS:
В PCL,
using System;
using Xamarin.Forms;
namespace SampleLoginRenderer
{
public class MyEntry : Entry
{
}
}
Xamarin Android Entry Renderer:
using Xamarin.Forms;
using System;
using Xamarin.Forms.Platform.Android;
using SampleLoginRenderer;
using SampleLoginRenderer.Android;
using Android.Content;
using Android.Graphics.Drawables;
using Android.Text;
using Android.Content.Res;
[assembly: ExportRenderer(typeof(MyEntry), typeof(MyEntryRenderer))]
namespace SampleLoginRenderer.Android
{
public class MyEntryRenderer : EntryRenderer
{
public MyEntryRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (Control != null)
{
GradientDrawable gd = new GradientDrawable();
gd.SetColor(global::Android.Graphics.Color.Transparent);
#pragma warning disable CS0618 // Type or member is obsolete
this.Control.SetBackgroundDrawable(gd);
#pragma warning restore CS0618 // Type or member is obsolete
this.Control.SetRawInputType(InputTypes.TextFlagNoSuggestions);
Control.SetHintTextColor(ColorStateList.ValueOf(global::Android.Graphics.Color.White));
}
}
}
}
Xamarin iOS Entry Renderer:
using SampleLoginRenderer;
using SampleLoginRenderer.iOS;
using Xamarin.Forms;
using System;
using Xamarin.Forms.Platform.iOS;
using UIKit;
[assembly: ExportRenderer(typeof(MyEntry), typeof(MyEntryRenderer))]
namespace SampleLoginRenderer.iOS
{
public class MyEntryRenderer : EntryRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (Control != null)
{
Control.BorderStyle = UITextBorderStyle.None;
Control.Layer.CornerRadius = 10;
Control.TextColor = UIColor.White;
}
}
}
}
Я запускаю приложение на iOS, и оно дает мне желаемый результат, которого я хочу (см. Ниже)
Но когда я запускаю одно и то же приложение на Android, я получаю следующее исключение, и приложение вылетает
Я не могу понять, почему это происходит на Android, тогда как на iOS все работает нормально.
Любые обходные пути или предложения будут высоко оценены.
Заранее спасибо