Xaml 自定义渲染中的事件引发
我有一个自定义渲染器,它是放置在StackLayout中的DatePicker控件。我有一个标签,它将调用CustomRenderer并显示日期选择器控件。当我点击标签时,CustomRenderer(OnElementChanged&&OnElementPropertyChanged)事件中没有引发任何事件。当我们更改日期时,将触发picker事件,并将该值设置为date picker和date picker closes。当我再次尝试打开日期选择器时,会显示上一个设置的日期。我想更改为当前日期。我没有重置日期的事件Xaml 自定义渲染中的事件引发,xaml,xamarin,xamarin.ios,xamarin.forms,Xaml,Xamarin,Xamarin.ios,Xamarin.forms,我有一个自定义渲染器,它是放置在StackLayout中的DatePicker控件。我有一个标签,它将调用CustomRenderer并显示日期选择器控件。当我点击标签时,CustomRenderer(OnElementChanged&&OnElementPropertyChanged)事件中没有引发任何事件。当我们更改日期时,将触发picker事件,并将该值设置为date picker和date picker closes。当我再次尝试打开日期选择器时,会显示上一个设置的日期。我想更改为当前日
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>
OnPlatform x:TypeArguments=“View”>
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);
}
}
}
使用Xamarin.Forms;
使用UIKit;
使用核心图形;
使用Xamarin.Forms.Platform.iOS;
使用制度;
使用VCS.FieldManager.UI.ViewModels;
[程序集:ExportRenderer(typeof(CustomStackLayout)、typeof(DatePickerExtendedRender))]
名称空间App.UI.iOS
{
类DatePickerExtendedRender:ViewRenderer
{
UIDatePicker datePicker=新UIDatePicker();
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
if(e.OldElement!=null | | Element==null)
{
返回;
}
var customStackLayout=e.NewElement;
if(customStackLayout!=null)
{
datePicker.Mode=UIDatePickerMode.Date;
UIView _view=新UIView()
{
帧=新的CGRect(10200,50,50),
//BackgroundColor=UIColor.Brown
};
datePicker.ValueChanged+=(发件人,参数)=>
{
var DateChangeEvent=DateTime.SpecifyKind(datePicker.Date.ToDateTime(),DateTimeKind.Utc).ToLocalTime();
var changedDate=DateChangeEvent.ToString(“MM dd,yyyy”);
//不应在“添加资源”的应用程序变量中设置
if(GridEntryViewModel.IsResourceDate)
{
Xamarin.Forms.Application.Current.Properties[“ResourceSelectedDate”]=DateChangeEvent.ToString(“MMMM dd,yyyy”);
datePicker.SetDate(datePicker.Date,true);
}
其他的
{
Xamarin.Forms.Application.Current.Properties[“GlobalDateSelected”]=changedDate;
GridEntryViewModel.IsResourceDate=false;
datePicker.SetDate(datePicker.Date,true);
}
发送(changedDate,“DatePickerCallback”);
};
_view.Add(日期选择器);
SetNativeControl(_视图);
}
}
受保护的覆盖无效OneElementPropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
}
}
}
UIDatepicker默认为当前日期,除非您更改它。由于您在类级别安装了日期选择器,因此它会维护日期。我认为以下一项或两项可以解决它
if (customStackLayout != null)
{
datePicker = new UIDatePicker();
或
不确定第二个数据类型日期是什么,您必须检查它并根据需要进行设置,但希望您能理解我的观点。UIDatepicker默认为当前日期,除非您更改它。由于您在类级别安装了日期选择器,因此它会维护日期。我认为以下一项或两项可以解决它
if (customStackLayout != null)
{
datePicker = new UIDatePicker();
或
不确定第二天的数据类型日期是什么,您必须检查它并根据需要进行设置,但希望您能理解我的观点。只是为了澄清您的基本问题,您只是问如何在单击标签时触发事件或命令?当前OnDateClickIOSForResource未启动,您希望它启动。请将您的问题通读几遍。从它点击标签的声音来看,数据采集器出现了。但是,如果在选择日期后,您再次单击标签,它会显示您以前选择的日期,而您希望它显示当前日期?只是为了澄清您的基本问题,只是询问如何在单击标签时触发事件或命令?当前OnDateClickIOSForResource未启动,您希望它启动。请将您的问题通读几遍。从它点击标签的声音来看,数据采集器出现了。但是,如果在选择日期后,您再次单击标签,它将显示您以前选择的日期,您希望它显示当前日期吗?