我们如何处理 Xamarin Forms Picker 的完成按钮单击事件?

How can we handle the done button click event for a Xamarin Forms Picker?

我想在 Xamarin Forms 中的选择器上的完成按钮上触发点击事件。我发现有些人对条目进行了自定义渲染,但我们如何在 Xamarin 表单 iOS 的选择器中实现完成按钮?

您可以使用自定义渲染器来实现此目的。查看 iOS 上 Picker 的 source code,您可以看到 'Done' 按钮已添加到 UIToolbar。您可以获得对按钮的引用,然后处理它的 'Clicked' 事件:

public class MyPickerRenderer : PickerRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
    {
        base.OnElementChanged(e);

        if(e.OldElement != null)
        {
            var toolbar = (UIToolbar)Control.InputAccessoryView;
            var doneBtn = toolbar.Items[1];

            doneBtn.Clicked -= DoneBtn_Clicked;
        }

        if(e.NewElement != null)
        {
            var toolbar = (UIToolbar)Control.InputAccessoryView;
            var doneBtn = toolbar.Items[1];

            doneBtn.Clicked += DoneBtn_Clicked;
        }
    }

    void DoneBtn_Clicked(object sender, EventArgs e)
    {
        Console.WriteLine("Clicked!!!!");
    }
}

我在没有自定义渲染的情况下做出的解决方法是,首先您需要使用以下代码更改所选项目在 iOS 上的行为:

<ContentPage xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core">
    <StackLayout Margin="20">
        <Picker x:Name="picker"
               Title="Select a monkey"
               ios:Picker.UpdateMode="WhenFinished"
               TitleColor="Red">
        <Picker.ItemsSource>
        <x:Array Type="{x:Type x:String}">
           <x:String>Baboon</x:String>
           <x:String>Capuchin Monkey</x:String>
           <x:String>Blue Monkey</x:String>
           <x:String>Squirrel Monkey</x:String>
           <x:String>Golden Lion Tamarin</x:String>
           <x:String>Howler Monkey</x:String>
           <x:String>Japanese Macaque</x:String>
        </x:Array>
  </Picker.ItemsSource>
</Picker>
    </StackLayout>
</ContentPage>

然后尝试收听 UnfocusedSelectedIndexChanged 事件处理程序

void picker_Unfocused(System.Object sender, Xamarin.Forms.FocusEventArgs e)
{
       //I want to reset the selected index every time the picker is closed.                  
       picker.SelectedIndex = -1;
}

void picker_SelectedIndexChanged(System.Object sender, System.EventArgs e)
{
    //Just in case the unfocused is fired first i make a validation to call an action
    if (picker.SelectedIndex >= 0){
     App.Current.MainPage.DisplayAlert("Selected monkey: ", picker.SelectedItem.ToString(), "Aceptar");
    }
}

并且您将能够看到 Android 上的警报将在点击条目中的对象时显示,而 iOS 上的警报将在选择项目时显示 AND 当用户点击 Done 按钮时