我正在创建一个自定义选择器渲染器。
以下是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>
当我第一次单击此选择器时
然后显示以下类型的对话框
现在,我关闭上面的对话框,然后再次单击选择器,然后显示下面的对话框。 这是显示的正确对话框。
我只想一直显示第二个对话框。但是第二次点击后就会显示。
更新
我正在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>
答案 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;
}
此问题解决后。