Запись на прием без подтверждения пользователя с помощью WinRT Appointments API

#c# #xaml #windows-runtime #windows-store-apps #appointment

#c# #xaml #windows-среда выполнения #windows-магазин-приложения #назначение

Вопрос:

Я экспериментирую с новым WinRT Appointments API в Windows 8.1 на основе образца, предоставленного на веб-сайте MSDN Microsoft: http://code.msdn.microsoft.com/windowsapps/Appointments-API-sample-2b55c76e

Это отлично работает, и я могу добавлять встречи без проблем, но при использовании метода из пространства имен всегда есть подтверждение от пользователя, который использует метод ShowAddAppointmentAsync из Windows.ApplicationModel.Appointments.AppointmentManager пространства имен, который показывает пользовательский интерфейс добавления назначений.

Я ищу решение для добавления большей коллекции встреч в календарь Windows 8 по умолчанию БЕЗ подтверждения для каждой отдельной встречи в коллекции. Есть ли способ обойти это и массово вставлять назначения? Может быть, Windows Live SDK?

Комментарии:

1. Может быть, это поможет msdn.microsoft.com/en-us/library/hh826523.aspx

Ответ №1:

Это правда, что API запрашивает пользователя перед сохранением, но для этого есть условие.

 var appointment = new Windows.ApplicationModel.Appointments.Appointment();
    appointment.details = "This is a dummy appointment";
    appointment.reminder = 15000;
    appointment.subject = "TEST APPPOINTMENT";

    var x = new Windows.ApplicationModel.Appointments.AppointmentManager.requestStoreAsync(Windows.ApplicationModel.Appointments.AppointmentStoreAccessType.appCalendarsReadWrite).done(function (apppointmentStore) {
        apppointmentStore.createAppointmentCalendarAsync("TEST CALENDAR").done(function (calendar) {
            calendar.saveAppointmentAsync(appointment);
        });
    })
  

Ответ №2:

Вот пример, как это сделать с помощью C#

         private AppointmentCalendar currentAppCalendar;
    private AsyncLazy<AppointmentStore> lazyAppointmentStore = new AsyncLazy<AppointmentStore>(async () =>
    {
        var appStore = await AppointmentManager.RequestStoreAsync(AppointmentStoreAccessType.AppCalendarsReadWrite);
        return appStore;
    });

    private AppointmentStore AppStore { get { return lazyAppointmentStore.Value.Resu< } }

    public AppointmentService()
    {
    }

    public async Task CreateCalendar()
    {
        IReadOnlyList<AppointmentCalendar> appCalendars =
            await AppStore.FindAppointmentCalendarsAsync(FindAppointmentCalendarsOptions.IncludeHidden);

        AppointmentCalendar appCalendar = null;

        // Apps can create multiple calendars. Here app creates only one.
        if (appCalendars.Count == 0)
        {
            appCalendar = await AppStore.CreateAppointmentCalendarAsync(Constants.CalendarName);
        }
        else
        {
            appCalendar = appCalendars[0];
        }

        appCalendar.OtherAppReadAccess = AppointmentCalendarOtherAppReadAccess.Full;
        appCalendar.OtherAppWriteAccess = AppointmentCalendarOtherAppWriteAccess.SystemOnly;

        // This app will show the details for the appointment. Use System to let the system show the details.
        appCalendar.SummaryCardView = AppointmentSummaryCardView.App;

        await appCalendar.SaveAsync();

        currentAppCalendar = appCalendar;
    }

    public async Task<bool> CreateNewAppointment(Data.Schemas.Task task)
    {
        if (null == task)
            throw new ArgumentNullException("task");

        Appointment newAppointment = new Appointment();
        this.SaveAppointmentData(task, newAppointment);

        try
        {
            // Show system calendar to the user to be edited
            string appointmentId = await AppointmentManager.ShowAddAppointmentAsync(newAppointment, Windows.Foundation.Rect.Empty);                
            return ! string.IsNullOrWhiteSpace(appointmentId);

            // Just save the appointment
            // await currentAppCalendar.SaveAppointmentAsync(newAppointment);                  
            // return true;
        }
        catch
        {
            return false;
        }
    }
  

Проверьте мой пост, чтобы узнать больше об AsyncLazy.

Я надеюсь, что это поможет вам. С уважением. Juanlu

Комментарии:

1. Большое вам спасибо! Я повсюду искал функциональность календаря для Windows. Чтобы уточнить, нужно ли создавать новый календарь каждый раз, когда вы хотите назначить новую встречу?

Ответ №3:

Это невозможно при использовании WinRT appointments API. Всегда требуется взаимодействие с пользователем. MS приняла дизайнерское решение о том, что некоторые действия требуют взаимодействия с пользователем, и это одно из них.

Как указано @Ken Tucker, вы можете использовать Windows live api для создания встреч, но для этого требуется, чтобы пользователь вашего приложения подключился к Windows Live и предоставил ему необходимые разрешения.