Форма выбора даты и времени Xamarin Forms - PullRequest
1 голос
/ 15 марта 2019

Я использую Xamarin Forms для создания кроссплатформенного приложения, и мне нужно создать простое представление, в котором пользователь может выбрать дату и время, похожее на это: Представление, которое я хочу создать , которое я нашел здесь: Сборщик в Xamarin iOS .Решение для Android готово, но мне нужно создать решение для iOS в том же приложении

Я не могу использовать стандартный сборщик даты и другой стандартный сборщик времени отдельно от Xamarin Forms.Мне нужно создать собственное решение (одно представление - просто выберите дату и время).

Я пытался создать представление в формах Xamarin, которые состоят из 2 списков в горизонтальной ориентации (один для даты, один для времени)но когда я выбираю одну позицию, список не прокручивается до середины обзора, а также при выборе прокрутки списка вверх или вниз отсутствует элемент автоматического выбора средней позиции.Я хочу создать что-то, что работает как решение Xamarin-iOS: «Выбор даты и времени», но в Xamarin Forms.

Я также пытался создать в Xamarin-iOS часть проекта «Выбор даты и времени».У меня есть main.storyboard и контроллер представления, но я не знаю, как отобразить представление из Xamarin-iOS внутри форм Xamarin и передать выбранные дату и время.

Не могли бы вы помочь мне, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Если вы хотите реализовать средство выбора даты и времени на Xamarin.Forms на платформе iOS. Вы можете использовать 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
    });

}

Я загрузил демо на github . Вы можете скачать его для теста.

Эффект

0 голосов
/ 15 марта 2019

Если вы хотите использовать собственные представления в Xamarin.Forms, это возможно, прочитайте его здесь: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/platform/native-views/

...