【问题标题】:Set reminder on device calendar using xamarin.forms cross platform C#使用 xamarin.forms 跨平台 C# 在设备日历上设置提醒
【发布时间】:2017-07-10 15:58:45
【问题描述】:

使用 xamarin.forms 跨平台 c# 在设备日历上设置提醒,使用 XamForms.Controls.Calendar 插件添加事件和日历显示,但现在我想使用跨平台在 xamarin 表单中设置特定设备日历上的提醒

【问题讨论】:

    标签: c# xamarin xamarin.forms cross-platform portable-class-library


    【解决方案1】:

    您不能直接从 Xamarin.Forms 项目使用/访问日历,因为您需要使用 DependancyService 并且需要为每个平台编写代码。我附上代码供参考。

    窗户 //https://msdn.microsoft.com/en-us/library/windows/apps/xaml/dn495339.aspx

    public async Task AddAppointment(ESF.Core.Models.ESFPortal_Events appointment)
    {
        var appointmentRcd = new Windows.ApplicationModel.Appointments.Appointment();
        var date = appointment.ExpireDate.Value.Date;
        var time = appointment.ExpireDate.Value.TimeOfDay;
        var timeZoneOffset = TimeZoneInfo.Local.GetUtcOffset(DateTime.Now);
        var startTime = new DateTimeOffset(date.Year, date.Month, date.Day, time.Hours, time.Minutes, 0, timeZoneOffset);
        appointmentRcd.StartTime = startTime;
    
        // Subject
        appointmentRcd.Subject = appointment.Title;
        // Location
        appointmentRcd.Location = appointment.WhereWhen;
        // Details
        appointmentRcd.Details = appointment.Description;
        // Duration          
        appointmentRcd.Duration = TimeSpan.FromHours(1);
        // All Day
        appointmentRcd.AllDay = false;
        //Busy Status
        appointmentRcd.BusyStatus = Windows.ApplicationModel.Appointments.AppointmentBusyStatus.Busy;
        // Sensitivity
        appointmentRcd.Sensitivity = Windows.ApplicationModel.Appointments.AppointmentSensitivity.Public;
        Rect rect = new Rect(new Point(10, 10), new Size(100, 200));
    string retVal = await AppointmentManager.ShowAddAppointmentAsync(appointmentRcd, rect, Windows.UI.Popups.Placement.Default);
        return !string.IsNullOrEmpty(retVal);
    }
    

    安卓 //http://developer.xamarin.com/guides/android/user_interface/calendar/ - 还使用了 Android Docs 来额外理解变量

    public async Task<bool> AddAppointment(ESF.Core.Models.ESFPortal_Events appointment)
    {
        Intent intent = new Intent(Intent.ActionInsert);
        intent.PutExtra(CalendarContract.Events.InterfaceConsts.Title, appointment.Title);
        intent.PutExtra(CalendarContract.Events.InterfaceConsts.Description, appointment.WhereWhen + " " + appointment.Description);
        intent.PutExtra(CalendarContract.Events.InterfaceConsts.Dtstart, GetDateTimeMS(appointment.ExpireDate.Value));
        intent.PutExtra(CalendarContract.Events.InterfaceConsts.Dtend, GetDateTimeMS(appointment.ExpireDate.Value.AddHours(1)));
        intent.PutExtra(CalendarContract.ExtraEventBeginTime, GetDateTimeMS(appointment.ExpireDate.Value));
        intent.PutExtra(CalendarContract.ExtraEventEndTime , GetDateTimeMS(appointment.ExpireDate.Value.AddHours(1)));
        intent.PutExtra(CalendarContract.Events.InterfaceConsts.EventTimezone, "UTC");
        intent.PutExtra(CalendarContract.Events.InterfaceConsts.EventEndTimezone, "UTC");
        intent.SetData(CalendarContract.Events.ContentUri);
        ((Activity)Forms.Context).StartActivity(intent);
        return true;
    }
    

    IOS //http://developer.xamarin.com/guides/ios/platform_features/introduction_to_event_kit/

    protected EKEventStore eventStore;
    public AppointmentServiceh_iOS()
    {
        eventStore = new EKEventStore();
    }
    public async Task<bool> AddAppointment(ESF.Core.Models.ESFPortal_Events appointment)
    {
        var granted = await eventStore.RequestAccessAsync(EKEntityType.Event);//, (bool granted, NSError e) =>
        if (granted.Item1)
        {
            EKEvent newEvent = EKEvent.FromStore(eventStore);
            newEvent.StartDate = DateTimeToNSDate(appointment.ExpireDate.Value);
            newEvent.EndDate = DateTimeToNSDate(appointment.ExpireDate.Value.AddHours(1));
            newEvent.Title = appointment.Title;
            newEvent.Notes = appointment.WhereWhen;
            newEvent.Calendar = eventStore.DefaultCalendarForNewEvents;
            NSError e;
            eventStore.SaveEvent(newEvent, EKSpan.ThisEvent, out e);
            return true;
        }
        else
        {
            new UIAlertView("Access Denied", "User Denied Access to Calendar Data", null, "ok", null).Show();
            return false;
        }
    }
    public DateTime NSDateToDateTime(NSDate date)
    {
        double secs = date.SecondsSinceReferenceDate;
            if (secs < -63113904000)
                return DateTime.MinValue;
            if (secs > 252423993599)
                return DateTime.MaxValue;
            return (DateTime)date;
        }
    
        public NSDate DateTimeToNSDate(DateTime date)
        {
            if (date.Kind == DateTimeKind.Unspecified)
                date = DateTime.SpecifyKind(date, DateTimeKind.Local);
            return (NSDate)date;
        }
    

    【讨论】:

    • 如何在 xamarin 便携类库中使用它
    • 我已经提到你需要使用DependencyService
    • @ChandreshKhambhayata GetDateTimeMS() 在此函数中,您正在计算从纪元时间开始的毫秒时间??
    • @ChandreshKhambhayata 保存该事件后有没有办法删除该事件?
    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多