首页 > 解决方案 > Xamarin Forms 日期和时间选择器

问题描述

我正在使用 Xamarin Forms 制作跨平台应用程序,我需要创建简单的视图,用户可以选择日期和时间,类似于: 我想要创建的视图,我在这里找到:Picker in Xamarin iOS。Android 解决方案已准备好,但我需要在同一应用程序中为 iOS 创建解决方案

我不能将标准日期选择器和另一个标准时间选择器与 Xamarin Forms 分开使用。我需要创建自定义解决方案(一个视图 - 简单地选择日期和时间)。

我试图在 Xamarin Forms 中创建视图,其中包含 2 个水平方向的列表(一个用于日期,一个用于时间)但是当我选择一个位置时,列表不会滚动到视图中间,也没有自动当我向上或向下滚动列表时选择中间位置元素。我想创建类似于 Xamarin-iOS 解决方案的东西:“日期和时间选择器”,但在 Xamarin Forms 中。

我还尝试在 Xamarin-iOS 中创建项目“日期和时间选择器”的一部分。我有 main.storyboard 和视图控制器,但我不知道如何在 Xamarin Forms 中显示来自 Xamarin-iOS 的视图并传递选定的日期和时间。

你能帮我吗?

标签: c#visual-studioxamarin.formsxamarin.ios

解决方案


如果您想在 iOS 平台的 Xamarin.Forms 上实现日期时间选择器。您可以使用CustomRenderer

在表格中

创建一个子类Picker

public class MyPicker:Picker
{
    public MyPicker()
    {

    }
}

并将其添加到 xaml

<StackLayout VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand">
    <!-- Place new controls here -->

    <local:MyPicker  WidthRequest="150"  BackgroundColor="AliceBlue"/>

</StackLayout>

在 iOS 中

创建.的渲染器Picker。您可以根据需要设置选择器的格式

using System;

using Foundation;
using UIKit;
using ObjCRuntime;

using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

using xxx;
using xxx.iOS;

[assembly:ExportRenderer(typeof(MyPicker),typeof(MyPickerRenderer))]
namespace xxx.iOS
{
  public class MyPickerRenderer:PickerRenderer
  {

    string SelectedValue;

    public MyPickerRenderer()
    {

    }

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

        if(Control!=null)
        {
            SetTimePicker();
        }

    }


    void  SetTimePicker()
    {
        UIDatePicker picker = new UIDatePicker
        {
            Mode = UIDatePickerMode.DateAndTime
        };

        picker.SetDate(NSDate.Now,true);

        picker.AddTarget(this,new Selector("DateChange:"),UIControlEvent.ValueChanged);

        Control.InputView = picker;


        UIToolbar toolbar = (UIToolbar)Control.InputAccessoryView;

        UIBarButtonItem done = new UIBarButtonItem("Done", UIBarButtonItemStyle.Done, (object sender, EventArgs click) =>
        {
            Control.Text = SelectedValue;
            toolbar.RemoveFromSuperview();
            picker.RemoveFromSuperview();
            Control.ResignFirstResponder();
            MessagingCenter.Send<Object, string>(this, "pickerSelected", SelectedValue);



        });

        UIBarButtonItem empty = new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace, null);

        toolbar.Items = new UIBarButtonItem[] { empty, done };

    }

    [Export("DateChange:")]
    void DateChange(UIDatePicker picker)
    {
        NSDateFormatter formatter = new NSDateFormatter();

        formatter.DateFormat = "MM-dd HH:mm aa"; //you can set the format as you want

        Control.Text = formatter.ToString(picker.Date);

        SelectedValue= formatter.ToString(picker.Date);

        MessagingCenter.Send<Object, string>(this,"pickerSelected",SelectedValue);
    }
  }
}

并用于MessagingCenter传递选定的日期和时间。

public MainPage()
{
    InitializeComponent();

    MessagingCenter.Subscribe<Object, string>(this, "pickerSelected", (sender, arg) => {
        Console.WriteLine(arg);
        //arg is the selected date and time
    });

}

我已经把demo上传到github了,大家可以下载来测试一下。

效果


推荐阅读