首次单击时不会渲染自定义选取器渲染器

问题描述 投票:0回答:4

我正在创建一个自定义选择器渲染器。下面是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

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

UPDATE

我在我的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>
xamarin xamarin.forms xamarin.android
4个回答
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;
            }
        }

0
投票

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

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


0
投票

什么是你的Xamarin.Forms版本?

当我使用版本3.4.0.1008975时,我遇到了与你相同的问题

然后我将XF更新到最新版本(3.6.0.344457),它运作良好。

所以你可以尝试将你的XF版本更新到最新版本;


0
投票

我找到了解决方法。

更新OnElementChangedCustomPickerRenderer.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;
}

并创造新方法

private void Control_FocusChange(object sender, FocusChangeEventArgs e)
{
    if (e.HasFocus)
    {
        Control_Click(null, null);
    }
}

做完这个问题后得到了解决。

© www.soinside.com 2019 - 2024. All rights reserved.