24 小时时间选择器选择的时间 [英] 24 hours Time Picker selected time

查看:65
本文介绍了24 小时时间选择器选择的时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试实施 24 小时 Time Picker 作为给定 此处 在 XF 项目中.

I tried implementing 24 Hour Time Picker as given here in XF project.

还有 FocusUnfocused 事件的问题,之前已解决,请参阅 这里

Also their was an issue with the Focus and Unfocused events which was solved earlier, see here

现在我想设置 Time PickerFocused 的时间,假设我已经将 2 小时绑定到 Time 属性,它应该选择了 2 小时打开,这不起作用.

Now I want to set the time when the Time Picker is Focused, say I have binded 2 hours to the Time property it should open with 2 hours selected, which is not working.

我注意到之前的时间被绑定在 Time Picker(被选中并点击 Ok 的时间),但我想要 Time代码> 绑定到被选中.我正在使用 Xamarin Forms 2.5.0.121934.

I have noticed the previous time gets binded on the Time Picker(time which was selected and Ok was clicked), but I want the Time which is binded to be selected. I am using Xamarin Forms 2.5.0.121934.

我使用了 Constant.TimeToBeShowOnPicker.HoursConstant.TimeToBeShowOnPicker.Minutes在绑定 Time else 的第一个值的代码中,默认情况下它是 0:00 hrs 或您设置的任何值.

I have used Constant.TimeToBeShowOnPicker.Hours and Constant.TimeToBeShowOnPicker.Minutes in the code to bind the first value of the Time else by default it is 0:00 hrs or whatever value you set.

public class TimePicker24Hours : ViewRenderer<Xamarin.Forms.TimePicker, Android.Widget.EditText>, TimePickerDialog.IOnTimeSetListener, IJavaObject, IDisposable
{
    private TimePickerDialog dialog = null;

    IElementController ElementController => Element as IElementController;

    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.TimePicker> e)
    {
        base.OnElementChanged(e);
        this.SetNativeControl(new Android.Widget.EditText(Forms.Context));
        this.Control.Click += Control_Click;
        this.Control.Text = DateTime.Now.ToString("HH:mm");
        this.Control.KeyListener = null;
        this.Control.FocusChange += Control_FocusChange;
    }

    void Control_FocusChange(object sender, Android.Views.View.FocusChangeEventArgs e)
    {
        if (e.HasFocus)
        {
            ShowTimePicker();
            ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, true);
        }
        else
        {
            ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false);
        }
    }

    void Control_Click(object sender, EventArgs e)
    {
        ShowTimePicker();
    }

    private void ShowTimePicker()
    {
        if (dialog == null)
        {
            dialog = new TimePickerDialog(Forms.Context, this, Constant.TimeToBeShowOnPicker.Hours, Constant.TimeToBeShowOnPicker.Minutes, true);
        }

        dialog.Show();
    }

    public void OnTimeSet(Android.Widget.TimePicker view, int hourOfDay, int minute)
    {
        var time = new TimeSpan(hourOfDay, minute, 0);
        this.Element.SetValue(Xamarin.Forms.TimePicker.TimeProperty, time);

        this.Control.Text = time.ToString(@"hh\:mm");

        this.ClearFocus();
    }
}

Xamarin.Forms XAML

<TimePicker x:Name="time_Picker" Time="{Binding SelectedTime}" IsVisible="false" PropertyChanged="TimePicker_PropertyChanged" />

Time Picker被要求来到Focus

void EditTime_Tapped(object sender, System.EventArgs e)
{
    var eventArgs = e as TappedEventArgs;
    ViewModel.SelectedTaskItem = (SomeModel)eventArgs.Parameter;

    ViewModel.SelectedTime = TimeSpan.FromHours(ViewModel.SomeModel.Time);
    Constant.TimeToBeShowOnPicker = ViewModel.SelectedTime;

    Device.BeginInvokeOnMainThread(() =>
    {
        time_Picker.Focus();
    });
}

推荐答案

答案

为了确保当前时间在点击时显示在时间选择器上,我们需要在 ShowPicker() 中包含 UpdateTime.

我还注意到 Control.Text 总是默认为 DateTime.Now.要解决这个问题,我们只需要在 OnElementChanged 中设置 Control.Text.

I also noticed that Control.Text always defaults to DateTime.Now. To fix this, we just need to set Control.Text in OnElementChanged.

我已经更新了自定义渲染器以检查是否设置了 Element.Time,如果设置了,那么我们可以设置 Control.Text = Element.Time.ToString(@"hh\:mm");

I've updated the Custom Renderers to check if Element.Time is set, and if it is then we can set Control.Text = Element.Time.ToString(@"hh\:mm");

我在这里创建了一个示例 Xamarin.Forms 应用程序,它使用了这个 24 小时时间选择器:https://github.com/brminnick/24HourTimePicker

I've created a sample Xamarin.Forms app here that uses this 24 Hour Time Picker: https://github.com/brminnick/24HourTimePicker

using System;

using Foundation;

using TimePickerDemo;
using TimePickerDemo.iOS;

using UIKit;

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

[assembly: ExportRenderer(typeof(CustomTimePicker24H), typeof(CustomTimePicker24HRenderer))]
namespace TimePickerDemo.iOS
{
    public class CustomTimePicker24HRenderer : TimePickerRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                var timePicker = (UIDatePicker)Control.InputView;
                timePicker.Locale = new NSLocale("no_nb");

                if (Element != null && !Element.Time.Equals(default(TimeSpan)))
                    Control.Text = Element.Time.ToString(@"hh\:mm");
                else
                    Control.Text = DateTime.Now.ToString("HH:mm");
            }
        }
    }
}

Android 自定义渲染器

using System;

using Android.App;
using Android.Text;
using Android.Content;
using Android.Runtime;

using Java.Lang;

using TimePickerDemo;
using TimePickerDemo.Droid;

using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(CustomTimePicker24H), typeof(CustomTimePicker24HRenderer))]
namespace TimePickerDemo.Droid
{
    public class CustomTimePicker24HRenderer : ViewRenderer<TimePicker, Android.Widget.EditText>, TimePickerDialog.IOnTimeSetListener, IJavaObject, IDisposable
    {
        TimePickerDialog _dialog;

        public CustomTimePicker24HRenderer(Context context) : base(context)
        {

        }

        Context CurrentContext => Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity;
        IElementController ElementController => Element as IElementController;

        public void OnTimeSet(Android.Widget.TimePicker view, int hourOfDay, int minute)
        {
            var time = new TimeSpan(hourOfDay, minute, 0);
            Element.SetValue(TimePicker.TimeProperty, time);

            Control.Text = time.ToString(@"hh\:mm");

            ClearFocus();
        }

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

            SetNativeControl(new Android.Widget.EditText(CurrentContext));

            if (Control != null)
            {
                Control.Click += Control_Click;
                Control.FocusChange += Control_FocusChange;

                if (Element != null && !Element.Time.Equals(default(TimeSpan)))
                    Control.Text = Element.Time.ToString(@"hh\:mm");
                else
                    Control.Text = DateTime.Now.ToString("HH:mm");
            }
        }

        void Control_FocusChange(object sender, FocusChangeEventArgs e)
        {
            if (e.HasFocus)
            {
                ShowTimePicker();
                ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, true);
            }
            else
            {
                ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false);
            }
        }

        void Control_Click(object sender, EventArgs e) => ShowTimePicker();

        void ShowTimePicker()
        {
            if (_dialog == null)
                _dialog = new TimePickerDialog(CurrentContext, this, Element.Time.Hours, Element.Time.Minutes, true);

            _dialog.UpdateTime(Element.Time.Hours, Element.Time.Minutes);

            _dialog.Show();
        }
    }
}

这篇关于24 小时时间选择器选择的时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆