24 小时时间选择器选择的时间 [英] 24 hours Time Picker selected time
问题描述
我尝试实施 24 小时 Time Picker
作为给定 此处 在 XF 项目中.
I tried implementing 24 Hour Time Picker
as given here in XF project.
还有 Focus
和 Unfocused
事件的问题,之前已解决,请参阅 这里
Also their was an issue with the Focus
and Unfocused
events which was solved earlier, see here
现在我想设置 Time Picker
是 Focused
的时间,假设我已经将 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.Hours
和 Constant.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屋!