使用来自 UWA 的约会创建自定义日历

Posted

技术标签:

【中文标题】使用来自 UWA 的约会创建自定义日历【英文标题】:Creating a custom calendar with appointments from UWA 【发布时间】:2017-04-04 18:35:56 【问题描述】:

我正在使用这个 sn-p 创建一个日历并将其放入用户的本机 Outlook 日历应用程序中:

async private Task CreateCalenderEntry()
    
        // 1. get access to appointmentstore 
        var appointmentStore = await AppointmentManager.RequestStoreAsync(AppointmentStoreAccessType.AppCalendarsReadWrite);

        // 2. get calendar 
        var appCustomApptCalendar = await appointmentStore.CreateAppointmentCalendarAsync("MyCalendar1");

        // 3. create new Appointment 
        var appo = new Appointment();

        // appointment properties 
        appo.AllDay = true;
        appo.Subject = "Sample Subject";
        appo.StartTime = DateTime.Now;

        //  4. add 
        await appCustomApptCalendar.SaveAppointmentAsync(appo);
    

问题是,当我调用此代码时,它会在 Outlook 日历中创建一个新的日历部分,其中包含一个名为“MyCalendar1”的日历,但我想要的是在用户帐户的日历中创建它。我能看到的是

CreateAppointmentCalendarAsync

实际上有 1 个重载

public IAsyncOperation<AppointmentCalendar> CreateAppointmentCalendarAsync(System.String name, System.String userDataAccountId);

我认为这是我正在寻找解决用户日历的问题,但考虑到这个“userDataAccountId”参数是用户的 ID,我应该在哪里找到它?

【问题讨论】:

您需要特殊功能才能将约会添加到用户日历。但如果您使用此功能,App 将无法通过认证。请参阅有关此here 的文档。寻找系统级预约访问 “系统级预约访问”和“用户数据帐户提供者”有什么区别?第一个说“没有人可以请求访问此功能以进行商店提交。”并且 UDAP 说“任何人都可以请求访问此功能以进行商店提交。”?毕竟我和我的公司需要将这个应用程序发布到商店(也有充分的理由要求这些功能,所以我认为这不会成为问题) 【参考方案1】:

但我想要的是在用户帐户的日历中创建它

我不确定你真正想要创建什么。如果你想在一个现有的邮件帐户中创建一个新日历,通过我这边的测试,目前是不允许的。如果您想在属于邮件帐户的现有日历中创建新约会,您需要为您的应用程序指定一个受限功能,正如@AVK Naidu 所说。 This picture可以更好地解释我所说的。

关于如何将新约会添加到现有日历中,您可以使用如下代码:

IReadOnlyList<AppointmentCalendar> appointmentCalendars = await appointmentStore.FindAppointmentCalendarsAsync();
foreach (AppointmentCalendar calendar in appointmentCalendars)

   if(calendar.DisplayName=="Calendar")
    
        AppointmentCalendar appointmentcalendar = await appointmentStore.GetAppointmentCalendarAsync(calendar.LocalId);
        await appointmentcalendar.SaveAppointmentAsync(appointment);
    

关于如何设置appointmentsSystem能力的详细信息如下:

<Package  
...
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" 
IgnorableNamespaces="uap mp rescap">
...
<Capabilities> 
  <Capability Name="internetClient" /> 
  <uap:Capability Name="appointments" />
  <uap:Capability Name="contacts" /> 
  <rescap:Capability Name="appointmentsSystem"/>
</Capabilities>  
</Package>

请注意,使用此功能,您需要在将应用提交到商店之前请求访问受限功能。

我认为这是我正在寻找解决用户日历的问题,但考虑到这个“userDataAccountId”参数是用户的 ID,我应该在哪里找到它?

userDataAccoundId 可以从已知的AppointmentCalendar 获得。的确,您可以通过此属性识别用户帐户数据。但是即使您从属于一个用户帐户的日历中获得了此属性,也不允许为该用户帐户创建新日历。您只能使用此属性将新日历添加到当前帐户。代码如下:

  var appCustomApptCalendarone  = await appointmentStore.CreateAppointmentCalendarAsync("currentacount-one");
  var userdataaccountid  = appCustomApptCalendarone.UserDataAccountId;
  var appCustomApptCalendartwo = await appointmentStore.CreateAppointmentCalendarAsync("currentacount-two", userdataaccountid);

更多详情请参考official sample.

【讨论】:

“系统级预约访问”和“用户数据帐户提供者”有什么区别? 在我看来,前一个用于约会,最后一个用于邮件、日历和联系人帐户。实际上都赋予系统级权限。也许您可以尝试最后一个,也许它可以工作。顺便说一句,如果我的回复对您有帮助,请您标记为已接受或投票吗?谢谢。 这一切都很好,但我找不到有关如何使用这些功能来完成我在任何地方已经描述过的事情的信息。有样品什么的吗?我只想在用户电子邮件帐户日历组中放置一些带有约会的日历 @nmrlqa4。这些功能在 package.appxmainfest 中设置,按 F7,您将看到代码,更新代码,如答案中所示。 不,我已将它们添加到清单中,但是现在如何将日历添加到用户的帐户日历组?有什么例子吗?

以上是关于使用来自 UWA 的约会创建自定义日历的主要内容,如果未能解决你的问题,请参考以下文章

Outlook 约会替换表单区域的功能区页面已禁用

打开约会项目时显示自定义任务窗格(会议发生和个人会议)

Wordpress中约会表单的自定义日期和时间

JqxScheduler 自定义对话框

C# WinForms 用鼠标拖动控件

使用 XtraScheduler 按特定自定义字段值获取约会