我正在创建一个自定义选择器渲染器。下面是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>
当我第一次点击这个选择器时
然后显示下面的对话框类型
现在我关闭上面的对话框并再次单击选择器,然后在对话框下方显示。这是对话显示。
我只是想一直显示第二个对话框。但它在第二次点击后显示。
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表格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;
}
}
您在第一次单击后生成对话框。您必须在OnElementChanged中创建平台级别控件。但在这种情况下,当您尝试在拾取器控件中显示对话框时,它将无济于事。我建议直接使用你的自定义对话框而不需要选择器控件。此外,您不需要自定义渲染器。
看看这个https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/pop-ups
什么是你的Xamarin.Forms版本?
当我使用版本3.4.0.1008975
时,我遇到了与你相同的问题
然后我将XF更新到最新版本(3.6.0.344457
),它运作良好。
所以你可以尝试将你的XF版本更新到最新版本;
我找到了解决方法。
更新OnElementChanged
的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;
}
并创造新方法
private void Control_FocusChange(object sender, FocusChangeEventArgs e)
{
if (e.HasFocus)
{
Control_Click(null, null);
}
}
做完这个问题后得到了解决。