Xaml 自定义渲染中的事件引发

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。当我再次尝试打开日期选择器时,会显示上一个设置的日期。我想更改为当前日

我有一个自定义渲染器,它是放置在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未启动,您希望它启动。请将您的问题通读几遍。从它点击标签的声音来看,数据采集器出现了。但是,如果在选择日期后,您再次单击标签,它将显示您以前选择的日期,您希望它显示当前日期吗?