背景说明
我正在使用Visual Studio for Mac开发跨平台移动应用程序。该项目的Xamarin.Forms版本是3.1.0.583944(这是最新版本)。对于Android,所有输入组件都有一行而不是(____________)的框,因此(并根据要求)创建了一个自定义渲染器来更改组件的外观。
在Project文件夹中创建了CustomPicker.cs:
using System;
using Xamarin.Forms;
namespace Project
{
public class CustomPicker : Picker
{
public Color BorderColor { get; set; } = Color.Black;
}
}
在Project.Droid文件夹中,创建了CustomPickerRenderer.cs:
using System;
using Android.Graphics;
using Android.Graphics.Drawables;
using Android.Views;
using Project;
using Project.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(CustomPicker), typeof(CustomPickerRenderer))]
namespace Project.Droid
{
public class CustomPickerRenderer : PickerRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
{
base.OnElementChanged(e);
if (Control != null)
{
var customPicker = (CustomPicker)e.NewElement;
GradientDrawable gd = new GradientDrawable();
gd.SetColor(Android.Graphics.Color.Transparent);
gd.SetStroke(2, customPicker.BorderColor.ToAndroid());
this.Control.SetBackground(gd);
this.Control.SetTextColor(e.NewElement.TextColor.ToAndroid());
this.Control.SetHintTextColor(Android.Graphics.Color.Gray);
}
}
}
}
xaml文件仅包含CustomPicker元素:
<?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:signature="clr-namespace:SignaturePad.Forms;assembly=SignaturePad.Forms" xmlns:res="clr-Project" x:Class="Poject.View" xmlns:local="clr-Project;assembly=Project">
<ContentPage.Content>
<local:CustomPicker x:Name="action_picker" TextColor="Black" Title="Seleccione la acción" BorderColor="#3D7C00" IsEnabled="false" ItemsSource="{Binding Actions}" ItemDisplayBinding="{Binding text}" SelectedIndexChanged="OnActionChange" SelectedItem="{Binding SelectedAction}" />
</ContentPage.Content>
</ContentPage>
问题
测试自定义选择器时,我得到了期望的结果;选择器会以类似框的边框(而不是下划线)和其他一些颜色正确显示。仅当测试了“所需”功能时,该组件才能按预期方式工作(单击该组件,等待对话框弹出选项,单击一个选项,然后单击“确定”按钮)。由于任何原因导致对话框中断时,都会出现此问题。例如,我单击该组件,然后出现弹出的选项对话框时,单击后退按钮-然后该对话框显示在另一个视图中,并且在点击选项或按钮时会引发异常。 (另一种情况是在对话框打开时发生的,我从顶部滑动屏幕以打开配置和通知菜单,然后返回到应用程序)。以下是StackTrace异常:
异常情况: System.NullReferenceException:对象引用未设置为对象的实例。 在Xamarin.Forms.Platform.Android.PickerRenderer + <> c__DisplayClass12_0.b__0 (System.Object s,Android.Content.DialogClickEventArgs a)[0x00000]在 D:\ a \ 1 \ s \ Xamarin.Forms.Platform.Android \ Renderers \ PickerRenderer.cs:135
at Android.Content.IDialogInterfaceOnClickListenerImplementor.OnClick
(Android.Content.IDialogInterface对话框,System.Int32其中) [0x0000a]在 /Users/builder/data/lanes/5809/a7829590/source/monodroid/external/xamarin-android/src/Mono.Android/obj/Release/android-27/mcw/Android.Content.IDialogInterface.cs:250>
at Android.Content.IDialogInterfaceOnClickListenerInvoker.n_OnClick_Landroid_content_DialogInterface_I
(System.IntPtr jnienv,System.IntPtr native__this,System.IntPtr native_dialog,System.Int32,其中[0x00010] /Users/builder/data/lanes/5809/a7829590/source/monodroid/external/xamarin-android/src/Mono.Android/obj/Release/android-27/mcw/Android.Content.IDialogInterface.cs:201>
at (wrapper dynamic-method) System.Object.b72d5cd8-e4b0-403b-a87c-7a28c7960847(intptr,intptr,intptr,int)
尝试了什么
在网络上搜索,我找到了许多可能的解决方案,但不幸的是,没有一个对我有用:
问题
在此问题上的任何帮助都将受到赞赏。在此先感谢所有愿意花时间阅读这篇文章并尝试提供帮助的人。