Xamarin.forms Xamarin表单:在TimePicker中关闭时钟pop后,UI上会显示不同的时间?

Xamarin.forms Xamarin表单:在TimePicker中关闭时钟pop后,UI上会显示不同的时间?,xamarin.forms,timepicker,Xamarin.forms,Timepicker,我在时间选择器中使用下面的设置以5的倍数设置时间。使用自定义渲染器,我可以选择5倍的时间。但在选择时间后,当时钟弹出关闭时,UI上会显示不同的时间。这个问题只存在于android平台,对于ios来说,一切都是例外 我的代码: public class CustomTimePickerRenderer : TimePickerRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Xama

我在时间选择器中使用下面的设置以5的倍数设置时间。使用自定义渲染器,我可以选择5倍的时间。但在选择时间后,当时钟弹出关闭时,UI上会显示不同的时间。这个问题只存在于android平台,对于ios来说,一切都是例外

我的代码:

public class CustomTimePickerRenderer : TimePickerRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.TimePicker> e)
    {
        base.OnElementChanged(e);

        TimePickerDialogIntervals timePickerDlg = new TimePickerDialogIntervals(this.Context, new EventHandler<TimePickerDialogIntervals.TimeSetEventArgs>(UpdateDuration),
            Element.Time.Hours, Element.Time.Minutes, true);

        var control = new EditText(this.Context);
        control.Focusable = false;
        control.FocusableInTouchMode = false;
        control.Clickable = false;
        control.Click += (sender, ea) => timePickerDlg.Show();
        control.Text = Element.Time.Hours.ToString("00") + ":" + Element.Time.Minutes.ToString("00");

        SetNativeControl(control);
    }

    void UpdateDuration(object sender, Android.App.TimePickerDialog.TimeSetEventArgs e)
    {
        Element.Time = new TimeSpan(e.HourOfDay, e.Minute, 0);
        Control.Text = Element.Time.Hours.ToString("00") + ":" + Element.Time.Minutes.ToString("00");
    }
}

public class TimePickerDialogIntervals : TimePickerDialog
{
    public const int TimePickerInterval = 05;
    private bool _ignoreEvent = false;

    public TimePickerDialogIntervals(Context context, EventHandler<TimePickerDialog.TimeSetEventArgs> callBack, int hourOfDay, int minute, bool is24HourView)
        : base(context, (sender, e) =>
        {
            callBack(sender, new TimePickerDialog.TimeSetEventArgs(e.HourOfDay, e.Minute * TimePickerInterval));
        }, hourOfDay, minute / TimePickerInterval, is24HourView)
    {
    }

    public override void OnTimeChanged(Android.Widget.TimePicker view, int hourOfDay, int minute)
    {
        base.OnTimeChanged(view, hourOfDay, minute);

        if (_ignoreEvent) return;

        if (minute % TimePickerInterval != 0)
        {
            int minuteFloor = minute - (minute % TimePickerInterval);
            minute = minuteFloor + (minute == minuteFloor + 1 ? TimePickerInterval : 0);
            if (minute == 60)
                minute = 0;
            _ignoreEvent = true;
            view.CurrentMinute = (Java.Lang.Integer)minute;
            _ignoreEvent = false;
        }
    }
}
public class TimePickerDialogIntervals : TimePickerDialog
{
    public const int TimePickerInterval = 15;
    private bool _ignoreEvent = false;
    public TimePickerDialogIntervals(Context context, EventHandler<TimePickerDialog.TimeSetEventArgs> callBack, int hourOfDay, int minute, bool is24HourView) :
        base(context, (sender, e) =>
        {
            callBack(sender, new TimePickerDialog.TimeSetEventArgs(e.HourOfDay, e.Minute));//remove '* TimePickerInterval'
        }, hourOfDay, minute / TimePickerInterval, is24HourView)
    {
    }
    ...
}
公共类CustomTimePickerRenderer:TimePickerRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
TimePickerDialogIntervals timePickerDlg=新的TimePickerDialogIntervals(this.Context,new EventHandler(UpdateDuration),
Element.Time.Hours,Element.Time.Minutes,true);
var control=neweditText(this.Context);
control.Focusable=false;
control.FocusableInTouchMode=false;
control.Clickable=false;
控件。单击+=(发送方,ea)=>timePickerDlg.Show();
control.Text=Element.Time.Hours.ToString(“00”)+:“+Element.Time.Minutes.ToString(“00”);
SetNativeControl(控制);
}
无效更新(对象发送者,Android.App.TimePickerDialog.TimeSetEventArgs e)
{
元素时间=新的时间跨度(例如小时,分钟,0);
Control.Text=Element.Time.Hours.ToString(“00”)+:“+Element.Time.Minutes.ToString(“00”);
}
}
公共类TimePickerDialog间隔:TimePickerDialog
{
public const int TimePickerInterval=05;
私有bool_ignoreEvent=false;
public TimePickerDialogIntervals(上下文上下文、事件处理程序回调、int hourOfDay、int minute、bool is24HourView)
:base(上下文,(发送者,e)=>
{
回调(发送方,新时间选择器Dialog.TimeSetEventArgs(e.HourOfDay,e.Minute*TimePickerInterval));
},HourrofDay,分钟/时间选择器Interval,IS24小时视图)
{
}
public override void OnTimeChanged(Android.Widget.TimePicker视图,int hourOfDay,int minute)
{
基本时间更改(视图、小时、天、分钟);
如果(_ignoreEvent)返回;
如果(分钟%TimePickerInterval!=0)
{
int minuteFloor=分钟-(分钟%TimePickerInterval);
分钟=minuteFloor+(分钟=minuteFloor+1?TimePickerInterval:0);
如果(分钟==60)
分钟=0;
_ignoreEvent=true;
view.CurrentMinute=(Java.Lang.Integer)分钟;
_ignoreEvent=false;
}
}
}

当时钟弹出窗口关闭时,为什么UI上会显示不同的时间?

问题是因为分钟已乘以“TimePickerInterval”(05)。将参数更改为“e.Minute”将按预期工作

代码:

public class CustomTimePickerRenderer : TimePickerRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.TimePicker> e)
    {
        base.OnElementChanged(e);

        TimePickerDialogIntervals timePickerDlg = new TimePickerDialogIntervals(this.Context, new EventHandler<TimePickerDialogIntervals.TimeSetEventArgs>(UpdateDuration),
            Element.Time.Hours, Element.Time.Minutes, true);

        var control = new EditText(this.Context);
        control.Focusable = false;
        control.FocusableInTouchMode = false;
        control.Clickable = false;
        control.Click += (sender, ea) => timePickerDlg.Show();
        control.Text = Element.Time.Hours.ToString("00") + ":" + Element.Time.Minutes.ToString("00");

        SetNativeControl(control);
    }

    void UpdateDuration(object sender, Android.App.TimePickerDialog.TimeSetEventArgs e)
    {
        Element.Time = new TimeSpan(e.HourOfDay, e.Minute, 0);
        Control.Text = Element.Time.Hours.ToString("00") + ":" + Element.Time.Minutes.ToString("00");
    }
}

public class TimePickerDialogIntervals : TimePickerDialog
{
    public const int TimePickerInterval = 05;
    private bool _ignoreEvent = false;

    public TimePickerDialogIntervals(Context context, EventHandler<TimePickerDialog.TimeSetEventArgs> callBack, int hourOfDay, int minute, bool is24HourView)
        : base(context, (sender, e) =>
        {
            callBack(sender, new TimePickerDialog.TimeSetEventArgs(e.HourOfDay, e.Minute * TimePickerInterval));
        }, hourOfDay, minute / TimePickerInterval, is24HourView)
    {
    }

    public override void OnTimeChanged(Android.Widget.TimePicker view, int hourOfDay, int minute)
    {
        base.OnTimeChanged(view, hourOfDay, minute);

        if (_ignoreEvent) return;

        if (minute % TimePickerInterval != 0)
        {
            int minuteFloor = minute - (minute % TimePickerInterval);
            minute = minuteFloor + (minute == minuteFloor + 1 ? TimePickerInterval : 0);
            if (minute == 60)
                minute = 0;
            _ignoreEvent = true;
            view.CurrentMinute = (Java.Lang.Integer)minute;
            _ignoreEvent = false;
        }
    }
}
public class TimePickerDialogIntervals : TimePickerDialog
{
    public const int TimePickerInterval = 15;
    private bool _ignoreEvent = false;
    public TimePickerDialogIntervals(Context context, EventHandler<TimePickerDialog.TimeSetEventArgs> callBack, int hourOfDay, int minute, bool is24HourView) :
        base(context, (sender, e) =>
        {
            callBack(sender, new TimePickerDialog.TimeSetEventArgs(e.HourOfDay, e.Minute));//remove '* TimePickerInterval'
        }, hourOfDay, minute / TimePickerInterval, is24HourView)
    {
    }
    ...
}
公共类TimePickerDialogIntervals:TimePickerDialog
{
public const int TimePickerInterval=15;
私有bool_ignoreEvent=false;
public TimePickerDialogIntervals(上下文上下文、事件处理程序回调、int hourOfDay、int minute、bool is24HourView):
基本(上下文,(发送方,e)=>
{
回调(发送方,新的TimePickerDialog.TimeSetEventArgs(e.HourOfDay,e.Minute));//删除“*TimePickerInterval”
},HourrofDay,分钟/时间选择器Interval,IS24小时视图)
{
}
...
}