2015-05-12 5 views

ответ

3

Эта страница действительно полезно, чтобы узнать, как форматировать даты в C#:

https://msdn.microsoft.com/en-us/library/8kb3ddd4%28v=vs.110%29.aspx

И с этим кодом, я был в состоянии показать 24-часовой формат:

TimePicker timePicker = new TimePicker 
{ 
    Format = "HH:mm" 
}; 
5

Единственное решение, которое я нашел здесь: 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"; 
      } 
     } 
    } 
} 
+0

Спасибо @ Mr.Koçak, есть еще 1 проблема с решением для Android. Когда я пытаюсь открыть сборщик с помощью команды Focus() в коде, диалоговое окно не появляется, когда я удаляю пользовательский рендерер, он показывает через Focus() любую идею? – iBoonZ

+0

Привет, вы пытаетесь вызвать фокус, когда нажата другая кнопка? Потому что у меня была такая же проблема, и я не знаю, почему сборщик не фокусируется. –

+0

Да, я скрываю сборщик и хочу показать сборщик, когда какая-то кнопка нажата, но Focus() не вызывает его :( – iBoonZ

0

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 .. Надеюсь, это поможет.

Смежные вопросы