c# - Xamarin Forms 日期和时间选择器
问题描述
我正在使用 Xamarin Forms 制作跨平台应用程序,我需要创建简单的视图,用户可以选择日期和时间,类似于: 我想要创建的视图,我在这里找到:Picker in Xamarin iOS。Android 解决方案已准备好,但我需要在同一应用程序中为 iOS 创建解决方案
我不能将标准日期选择器和另一个标准时间选择器与 Xamarin Forms 分开使用。我需要创建自定义解决方案(一个视图 - 简单地选择日期和时间)。
我试图在 Xamarin Forms 中创建视图,其中包含 2 个水平方向的列表(一个用于日期,一个用于时间)但是当我选择一个位置时,列表不会滚动到视图中间,也没有自动当我向上或向下滚动列表时选择中间位置元素。我想创建类似于 Xamarin-iOS 解决方案的东西:“日期和时间选择器”,但在 Xamarin Forms 中。
我还尝试在 Xamarin-iOS 中创建项目“日期和时间选择器”的一部分。我有 main.storyboard 和视图控制器,但我不知道如何在 Xamarin Forms 中显示来自 Xamarin-iOS 的视图并传递选定的日期和时间。
你能帮我吗?
解决方案
如果您想在 iOS 平台的 Xamarin.Forms 上实现日期时间选择器。您可以使用CustomRenderer。
在表格中
创建一个子类Picker
public class MyPicker:Picker
{
public MyPicker()
{
}
}
并将其添加到 xaml
<StackLayout VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand">
<!-- Place new controls here -->
<local:MyPicker WidthRequest="150" BackgroundColor="AliceBlue"/>
</StackLayout>
在 iOS 中
创建.的渲染器Picker
。您可以根据需要设置选择器的格式。
using System;
using Foundation;
using UIKit;
using ObjCRuntime;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using xxx;
using xxx.iOS;
[assembly:ExportRenderer(typeof(MyPicker),typeof(MyPickerRenderer))]
namespace xxx.iOS
{
public class MyPickerRenderer:PickerRenderer
{
string SelectedValue;
public MyPickerRenderer()
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
{
base.OnElementChanged(e);
if(Control!=null)
{
SetTimePicker();
}
}
void SetTimePicker()
{
UIDatePicker picker = new UIDatePicker
{
Mode = UIDatePickerMode.DateAndTime
};
picker.SetDate(NSDate.Now,true);
picker.AddTarget(this,new Selector("DateChange:"),UIControlEvent.ValueChanged);
Control.InputView = picker;
UIToolbar toolbar = (UIToolbar)Control.InputAccessoryView;
UIBarButtonItem done = new UIBarButtonItem("Done", UIBarButtonItemStyle.Done, (object sender, EventArgs click) =>
{
Control.Text = SelectedValue;
toolbar.RemoveFromSuperview();
picker.RemoveFromSuperview();
Control.ResignFirstResponder();
MessagingCenter.Send<Object, string>(this, "pickerSelected", SelectedValue);
});
UIBarButtonItem empty = new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace, null);
toolbar.Items = new UIBarButtonItem[] { empty, done };
}
[Export("DateChange:")]
void DateChange(UIDatePicker picker)
{
NSDateFormatter formatter = new NSDateFormatter();
formatter.DateFormat = "MM-dd HH:mm aa"; //you can set the format as you want
Control.Text = formatter.ToString(picker.Date);
SelectedValue= formatter.ToString(picker.Date);
MessagingCenter.Send<Object, string>(this,"pickerSelected",SelectedValue);
}
}
}
并用于MessagingCenter
传递选定的日期和时间。
public MainPage()
{
InitializeComponent();
MessagingCenter.Subscribe<Object, string>(this, "pickerSelected", (sender, arg) => {
Console.WriteLine(arg);
//arg is the selected date and time
});
}
我已经把demo上传到github了,大家可以下载来测试一下。
推荐阅读
- oracle - 我们可以将 Oracle apex 连接到 Control-M 吗?
- spring - Spring Boot 安全性中的 HTTP 403 禁止错误
- java - 即使我为所有步骤创建了步骤定义,功能文件也会显示每个步骤的警告
- amazon-dynamodb - 无法连接到本地 DynamoDB(无服务器框架)
- javascript - 查看节点请求正文
- java - 是否可以不在休眠映射中创建第三个表
- node.js - Mongoose 聚合:当我使用 replaceRoot 时,无法在我组的女巫上显示参数
- php - 在codeigniter中使用ajax插入和检索数组数据
- angular - onChange() 应该匹配最后输入的字母,而不是每次都匹配整行
- javascript - 布尔玛模式在显示警报后保持关闭