Xamarin表示时间戳24小时

时间:2015-05-12 10:10:14

标签: xamarin xamarin.forms timepicker

我是Xamarin.Forms的新手,我似乎无法找到如何以24小时格式而不是AM / PM显示对话框

有人可以帮助我吗?

谢谢

4 个答案:

答案 0 :(得分:7)

我找到的唯一解决方案是: 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";
            }
        }
    }
}

答案 1 :(得分:4)

此页面非常有用,可以学习如何在C#格式化日期:

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

使用此代码,我能够显示24小时格式:

Sub select_date_range(LastCol As Long, LastRow_date_new As Long, DateMax As Date, Date_end As Date)
Dim SearchCol As Integer
Dim row_i As Integer
Dim row_j As Integer
Dim Start_row As Integer
Dim End_row As Integer

With Worksheets("a")
    For SearchCol = 1 To LastCol Step 3
        LastRow_date_new = Application.CountA(.Range((.Cells(1, SearchCol)), (.Cells(65536, SearchCol))))
        For row_i = 2 To LastRow_date_new
            If Sheets("a").Cells(row_i, SearchCol).Value = DateMax Then Start_row = row_i
        Next row_i
        For row_j = LastRow_date_new To 2 Step -1
            If Sheets("a").Cells(row_j, SearchCol).Value = Date_end Then End_row = row_j
        Next row_j
        ''''''' use range col1, row i to col2, row j to copy into new sheet
        Call copy_to_b(Start_row, SearchCol, End_row)
    Next SearchCol
End With

End Sub

答案 2 :(得分:1)

在XAML中,您可以使用Format属性将24小时格式字符串设置为TimePicker

<TimePicker Format="HH:mm"/>

答案 3 :(得分:0)

确定。你必须做特定的平台...我做了类似的事情。 所以创建一个接口

public interface TimePickerInterface
    {
        void showTimePicker (ButtonOrLabel lbl);
    }

在Android中,您可以创建时间选择器类

[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中调用它:

DependencyService.Get<TimePickerInterface> ().showTimePicker(myButtonOrLabel);

你可以为DatePicker做同样的事情.. 希望它有所帮助..