自定义选择器渲染器未在首次单击时渲染

时间:2019-04-17 12:56:43

标签: xamarin xamarin.forms xamarin.android

我正在创建一个自定义选择器渲染器。 以下是CustomPickerRenderer.cs

[assembly: ExportRenderer(typeof(CustomPicker), typeof(CustomPickerRenderer))]
namespace POC.Droid.CustomRenders
{
    public class CustomPickerRenderer : PickerRenderer
    {
        public CustomPickerRenderer()
        {

        }


        private Dialog dialog;

        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement == null || e.OldElement != null)
                return;

            Control.Click += Control_Click1;
        }

        protected override void Dispose(bool disposing)
        {
            Control.Click -= Control_Click1;
            base.Dispose(disposing);
        }

        private void Control_Click1(object sender, EventArgs e)
        {
            Picker model = Element;
            dialog = new Dialog(Forms.Context);
            dialog.SetContentView(Resource.Layout.custom_picker_dialog);
            Android.Widget.ListView listView = (Android.Widget.ListView)dialog.FindViewById(Resource.Id.lv);
            listView.Adapter = new CustomPickerAdapter(((List<PickerModel>)model.ItemsSource), model.SelectedIndex);
            listView.ItemClick += (object sender1, ItemClickEventArgs e1) =>
            {
                Element.SelectedIndex = e1.Position;
                dialog.Hide();
            };
            if (model.ItemsSource.Count > 3)
            {
                var height = Xamarin.Forms.Application.Current.MainPage.Height;
                var width = Xamarin.Forms.Application.Current.MainPage.Width;
                //dialog.Window.SetLayout(700, 800);
                dialog.Window.SetLayout(Convert.ToInt32(width * 2.70), Convert.ToInt32(height * 2));
            }
            dialog.Show();
        }

    }
}

我的custom_picker_dialog.axml

<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingTop="20dp"
    android:paddingBottom="20dp">
    <TextView
        android:text="Select One Option ?"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="25dp"
        android:paddingRight="25dp"/>
  <ListView
      android:id="@+id/lv"
      android:layout_width="wrap_content"
      android:layout_height="0dp"
      android:layout_weight="1">

  </ListView>
</LinearLayout>

当我第一次单击此选择器时

enter image description here

然后显示以下类型的对话框

enter image description here

现在,我关闭上面的对话框,然后再次单击选择器,然后显示下面的对话框。 这是显示的正确对话框。

enter image description here

我只想一直显示第二个对话框。但是第二次点击后就会显示。

更新

我正在xaml中使用这样的自定义选择器。

<custom:CustomPicker x:Name="pickerElement" Title="Select Country" ItemDisplayBinding="{Binding Text}" SelectedIndexChanged="SelectedIndexChanged" SelectedItem="{Binding SelectedItem}" SelectedIndex="{Binding SelectedIndexChanged}" ItemsSource="{Binding Countries}"></custom:CustomPicker>

4 个答案:

答案 0 :(得分:1)

xamarin表格3.4中存在错误 Unwanted focus on picker

对我来说,我通过使用针对Android的自定义渲染器解决了该问题

protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                Control.Focusable = false;
                Control.FocusableInTouchMode = false;
            }
        }

答案 1 :(得分:0)

第一次单击后将生成对话框。您必须在OnElementChanged内部创建平台级别的控件。但是在这种情况下,当您尝试在选择器控件中显示对话框时,它将无济于事。我建议直接使用您的自定义对话框而不使用选择器控件。另外,您不需要为此的自定义渲染器。

也看看这个 https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/pop-ups

答案 2 :(得分:0)

您的 Xamarin.Forms 版本是什么?

我使用版本时遇到与您相同的问题 3.4.0.1008975

然后我将XF更新到最新版本(3.6.0.344457),效果很好。

因此您可以尝试将XF版本更新为最新版本;

答案 3 :(得分:0)

我找到了解决方法。

更新OnElementChanged的{​​{1}}方法

CustomPickerRenderer.cs

并创建新方法

protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
{
    base.OnElementChanged(e);

    if (e.NewElement == null || e.OldElement != null)
        return;

    Control.Click += Control_Click;
    Control.FocusChange += Control_FocusChange;
}

此问题解决后。