Я новичок в Xamarin.Forms и я не могу найти, кажется, как показать диалог в формате 24hour вместо AM/PMXamarin Формы timepicker 24hour
может кто-нибудь мне помочь?
Спасибо
Я новичок в Xamarin.Forms и я не могу найти, кажется, как показать диалог в формате 24hour вместо AM/PMXamarin Формы timepicker 24hour
может кто-нибудь мне помочь?
Спасибо
Эта страница действительно полезно, чтобы узнать, как форматировать даты в C#:
https://msdn.microsoft.com/en-us/library/8kb3ddd4%28v=vs.110%29.aspx
И с этим кодом, я был в состоянии показать 24-часовой формат:
TimePicker timePicker = new TimePicker
{
Format = "HH:mm"
};
Единственное решение, которое я нашел здесь: 24h timepicker
В основном необходим индивидуальный рендерер в рамках каждого проекта платформы.
Xamarin.iOS:
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using PersonalTrainer.iOS.View.Controls;
[assembly: ExportRenderer (typeof (TimePicker), typeof (TimePicker24HRenderer))]
namespace YourNamespace.iOS.View.Controls {
public class TimePicker24HRenderer : TimePickerRenderer {
protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e) {
base.OnElementChanged(e);
var timePicker = (UIDatePicker)Control.InputView;
timePicker.Locale = new NSLocale("no_nb");
}
}
}
для Android:
[assembly: ExportRenderer(typeof(TimePicker), typeof(TimePicker24HRenderer))]
namespace YourNamespace.Droid.View.Controls {
public class TimePicker24HRenderer : ViewRenderer<Xamarin.Forms.TimePicker, Android.Widget.EditText>, TimePickerDialog.IOnTimeSetListener, IJavaObject, IDisposable {
private TimePickerDialog dialog = null;
protected override void OnElementChanged(ElementChangedEventArgs<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(); }
}
void Control_Click(object sender, EventArgs e) {
ShowTimePicker();
}
private void ShowTimePicker() {
if (dialog == null) {
dialog = new TimePickerDialog(Forms.Context, this, DateTime.Now.Hour, DateTime.Now.Minute, true);
}
dialog.Show();
}
public void OnTimeSet(Android.Widget.TimePicker view, int hourOfDay, int minute) {
var time = new TimeSpan(hourOfDay, minute, 0);
this.Element.SetValue(TimePicker.TimeProperty, time);
this.Control.Text = time.ToString(@"hh\:mm");
}
}
}
для Windows Phone:
[assembly: ExportRenderer (typeof (MyTimePicker), typeof (TimePicker24HRenderer))]
namespace YourNamespace.WindowsPhone.View.Controls {
public class TimePicker24HRenderer : TimePickerRenderer {
// Override the OnElementChanged method so we can tweak this renderer post-initial setup
protected override void OnElementChanged (ElementChangedEventArgs<Xamarin.Forms.TimePicker> e) {
base.OnElementChanged (e);
if (Control != null) {
var nativeControl = (Windows.UI.Xaml.Controls.TimePicker)Control;
nativeControl.Foreground = new SolidColorBrush(Colors.Gray);
Control.ClockIdentifier = "24HourClock";
}
}
}
}
Ok. Вы должны сделать это особым образом. Я сделал что-то подобное. Так создать интерфейс
public interface TimePickerInterface
{
void showTimePicker (ButtonOrLabel lbl);
}
В Android вы создать свой класс timepicker
[assembly:Dependency(typeof(yournamespace.MyTimePicker))]
namespace yournamespace
{
public class MyTimePicker:Java.Lang.Object,TimePickerInterface,Android.App.TimePickerDialog.IOnTimeSetListener
{
String originalText="";
LabelOrButton lbl=new LabelOrButton();
public void showTimePicker(LabelOrButton lbl)
{
var c = Forms.Context;
originalText = lbl.Text;
this.lbl = lbl;
var time = DateTime.Now.TimeOfDay;
TimePickerDialog dialog = new TimePickerDialog(c,this,time.Hours,time.Minutes,true);
dialog.SetCanceledOnTouchOutside (true);
dialog.Show();
}
public void OnTimeSet (Android.Widget.TimePicker view, int hourOfDay, int minute)
{
if(view.IsShown)
lbl.Text = (hourOfDay<=9 ? ("0"+hourOfDay+""):hourOfDay+"")+":"+(minute<=9 ? ("0"+minute+""):minute+"");
}
}
}
И в вашем Xamarin форм вы называете его в ActionListener вашей кнопки или gesturerecognizer вашей этикетки:
DependencyService.Get<TimePickerInterface>().showTimePicker(myButtonOrLabel);
Вы можете сделать то же самое для DatePicker .. Надеюсь, это поможет.
Спасибо @ Mr.Koçak, есть еще 1 проблема с решением для Android. Когда я пытаюсь открыть сборщик с помощью команды Focus() в коде, диалоговое окно не появляется, когда я удаляю пользовательский рендерер, он показывает через Focus() любую идею? – iBoonZ
Привет, вы пытаетесь вызвать фокус, когда нажата другая кнопка? Потому что у меня была такая же проблема, и я не знаю, почему сборщик не фокусируется. –
Да, я скрываю сборщик и хочу показать сборщик, когда какая-то кнопка нажата, но Focus() не вызывает его :( – iBoonZ