如何根据 Xamarin 中的系统设置更改 TimeFormat
How to change TimeFormat depending on system setting in Xamarin
我更新了Xamarin.Forms到最新版本4.8.0.1560。我设法在 Android 和 iOS 上绑定了时间选择器。与我的应用程序唯一的差异是当用户在他们的 phone 中使用 24 时间设置时,时间选择器“卡住”在 12 小时格式中。
为了做到这一点,我在 iOS
中创建了一个自定义渲染器
[assembly: ExportRenderer(typeof(TimePicker), typeof(TimeRenderer))]
namespace TabsApp.iOS.custom.renderers
{
public class TimeRenderer : TimePickerRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e)
{
base.OnElementChanged(e);
int hours = Element.Time.Hours;
int minutes = Element.Time.Minutes;
if (!Is12Hours())
{
var timePicker = (UIDatePicker)Control.InputView;
timePicker.Locale = new NSLocale("no_nb");
}
string format = Is12Hours()?"hh:mm tt":"HH:mm";
DateTime currTime = DateTime.Now;
currTime = new DateTime(currTime.Year,currTime.Month,currTime.Day,hours,minutes,0);
Control.Text = currTime.ToString(format);
}
private bool Is12Hours()
{
var dateFormatter = new NSDateFormatter();
dateFormatter.DateStyle = NSDateFormatterStyle.None;
dateFormatter.TimeStyle = NSDateFormatterStyle.Short;
var dateString = dateFormatter.ToString(NSDate.Now);
var isTwelveHourFormat =
dateString.Contains(dateFormatter.AMSymbol) ||
dateString.Contains(dateFormatter.PMSymbol);
return isTwelveHourFormat;
}
}
}
加载应用程序后将调用 OnElementChanged,它将显示正确的时间格式。当您更改时间时,不会调用此回调。我需要覆盖其他功能吗?
最后我从 xamarin 表单中找到了答案。您将需要 change/add 自定义时间选择器渲染器。
这是代码
[assembly: ExportRenderer(typeof(TimePicker), typeof(TimeRenderer))]
namespace TabsApp.iOS.custom.renderers
{
public class TimeRenderer : TimePickerRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e)
{
base.OnElementChanged(e);
if (Is12Hours())
{
Element.Format = "hh:mm tt";
}
else
{
var timePicker = (UIDatePicker)Control.InputView;
timePicker.Locale = new NSLocale("no_nb");
Element.Format = "HH:mm";
}
}
private bool Is12Hours()
{
var dateFormatter = new NSDateFormatter();
dateFormatter.DateStyle = NSDateFormatterStyle.None;
dateFormatter.TimeStyle = NSDateFormatterStyle.Short;
var dateString = dateFormatter.ToString(NSDate.Now);
var isTwelveHourFormat =
dateString.Contains(dateFormatter.AMSymbol) ||
dateString.Contains(dateFormatter.PMSymbol);
return isTwelveHourFormat;
}
}
}
我更新了Xamarin.Forms到最新版本4.8.0.1560。我设法在 Android 和 iOS 上绑定了时间选择器。与我的应用程序唯一的差异是当用户在他们的 phone 中使用 24 时间设置时,时间选择器“卡住”在 12 小时格式中。
为了做到这一点,我在 iOS
中创建了一个自定义渲染器[assembly: ExportRenderer(typeof(TimePicker), typeof(TimeRenderer))]
namespace TabsApp.iOS.custom.renderers
{
public class TimeRenderer : TimePickerRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e)
{
base.OnElementChanged(e);
int hours = Element.Time.Hours;
int minutes = Element.Time.Minutes;
if (!Is12Hours())
{
var timePicker = (UIDatePicker)Control.InputView;
timePicker.Locale = new NSLocale("no_nb");
}
string format = Is12Hours()?"hh:mm tt":"HH:mm";
DateTime currTime = DateTime.Now;
currTime = new DateTime(currTime.Year,currTime.Month,currTime.Day,hours,minutes,0);
Control.Text = currTime.ToString(format);
}
private bool Is12Hours()
{
var dateFormatter = new NSDateFormatter();
dateFormatter.DateStyle = NSDateFormatterStyle.None;
dateFormatter.TimeStyle = NSDateFormatterStyle.Short;
var dateString = dateFormatter.ToString(NSDate.Now);
var isTwelveHourFormat =
dateString.Contains(dateFormatter.AMSymbol) ||
dateString.Contains(dateFormatter.PMSymbol);
return isTwelveHourFormat;
}
}
}
加载应用程序后将调用 OnElementChanged,它将显示正确的时间格式。当您更改时间时,不会调用此回调。我需要覆盖其他功能吗?
最后我从 xamarin 表单中找到了答案。您将需要 change/add 自定义时间选择器渲染器。
这是代码
[assembly: ExportRenderer(typeof(TimePicker), typeof(TimeRenderer))]
namespace TabsApp.iOS.custom.renderers
{
public class TimeRenderer : TimePickerRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e)
{
base.OnElementChanged(e);
if (Is12Hours())
{
Element.Format = "hh:mm tt";
}
else
{
var timePicker = (UIDatePicker)Control.InputView;
timePicker.Locale = new NSLocale("no_nb");
Element.Format = "HH:mm";
}
}
private bool Is12Hours()
{
var dateFormatter = new NSDateFormatter();
dateFormatter.DateStyle = NSDateFormatterStyle.None;
dateFormatter.TimeStyle = NSDateFormatterStyle.Short;
var dateString = dateFormatter.ToString(NSDate.Now);
var isTwelveHourFormat =
dateString.Contains(dateFormatter.AMSymbol) ||
dateString.Contains(dateFormatter.PMSymbol);
return isTwelveHourFormat;
}
}
}