【发布时间】:2017-05-14 22:19:34
【问题描述】:
我有一个自定义渲染器,它是放置在 StackLayout 内的 DatePicker 控件。我有一个标签,它将调用 CustomRenderer 并显示日期选择器控件。当我点击标签时,CustomRenderer (OnElementChanged && OnElementPropertyChanged) 事件中没有引发任何事件。当我们更改选择器事件触发的日期并且值设置为日期选择器并且日期选择器关闭时。当我尝试再次打开日期选择器时,会显示之前设置的日期。我想更改为当前日期。我没有重置日期的活动。
OnPlatform x:TypeArguments="View">
<OnPlatform.Android>
<local:CustomDatePicker AbsoluteLayout.LayoutBounds="1,0.5,-1,-1" WidthRequest="140" TextColor="Black" Date="{Binding ResourceDate}"
AbsoluteLayout.LayoutFlags="PositionProportional"/>
</OnPlatform.Android>
<OnPlatform.iOS>
<Label Text="{Binding ResourceDateIOS}" AbsoluteLayout.LayoutBounds="1,0.5,-1,-1" AbsoluteLayout.LayoutFlags="PositionProportional" FontSize="Small" TextColor="Black" >
<Label.GestureRecognizers>
<TapGestureRecognizer Command="{Binding OnDateClickIOSForResource}" />
</Label.GestureRecognizers>
</Label>
</OnPlatform.iOS>
</OnPlatform>
IOS 堆栈自定义渲染:
using Xamarin.Forms;
using UIKit;
using CoreGraphics;
using Xamarin.Forms.Platform.iOS;
using System;
using VCS.FieldManager.UI.ViewModels;
[assembly: ExportRenderer(typeof(CustomStackLayout), typeof(DatePickerExtendedRender))]
namespace App.UI.iOS
{
class DatePickerExtendedRender : ViewRenderer<CustomStackLayout, UIView>
{
UIDatePicker datePicker = new UIDatePicker();
protected override void OnElementChanged(ElementChangedEventArgs<CustomStackLayout> e)
{
if (e.OldElement != null || Element == null)
{
return;
}
var customStackLayout = e.NewElement;
if (customStackLayout != null)
{
datePicker.Mode = UIDatePickerMode.Date;
UIView _view = new UIView()
{
Frame = new CGRect(10, 200, 50, 50),
// BackgroundColor = UIColor.Brown
};
datePicker.ValueChanged += (sender, arg) =>
{
var DateChangeEvent = DateTime.SpecifyKind(datePicker.Date.ToDateTime(), DateTimeKind.Utc).ToLocalTime();
var changedDate = DateChangeEvent.ToString("MMMM dd, yyyy");
//shouldnot set in application variable for Add Resources
if (GridEntryViewModel.IsResourceDate)
{
Xamarin.Forms.Application.Current.Properties["ResourceSelectedDate"] = DateChangeEvent.ToString("MMMM dd, yyyy");
datePicker.SetDate(datePicker.Date, true);
}
else
{
Xamarin.Forms.Application.Current.Properties["GlobalDateSelected"] = changedDate;
GridEntryViewModel.IsResourceDate = false;
datePicker.SetDate(datePicker.Date, true);
}
MessagingCenter.Send(changedDate, "DatePickerCallback");
};
_view.Add(datePicker);
SetNativeControl(_view);
}
}
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
}
}
}
【问题讨论】:
-
只是为了澄清您基本上只是在询问如何在单击标签时触发事件或命令?目前 OnDateClickIOSForResource 没有触发,您希望它触发。
-
通读你的问题几次。从它的声音中单击您的标签是使数据选择器出现。但是,如果在选择日期后再次单击标签,它会显示您之前选择的日期,而您希望它显示当前日期?
标签: xaml xamarin xamarin.ios xamarin.forms