【问题标题】:Event Raising in Custom Render自定义渲染中的事件引发
【发布时间】: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


【解决方案1】:

UIDatepicker 默认为当前日期,除非您更改它。由于您在班级级别设置日期选择器,因此它会维护日期。我认为以下一项或两项都可以解决它。

if (customStackLayout != null)
            {   
              datePicker = new UIDatePicker();

if (customStackLayout != null)
            {   
              datePicker.Date = DateTime.Now;

不确定第二个数据类型日期是什么,您必须检查它并根据需要进行设置,但希望您明白我的意思。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多