Criar aplicativos UWP com o Microsoft Graph
Este tutorial ensina como criar um aplicativo UWP (Plataforma universal de Windows) que usa a API do Microsoft Graph para recuperar informações de calendário para um usuário.
Dica
Se você preferir apenas baixar o tutorial concluído, poderá baixar ou clonar o GitHub repositório.
Pré-requisitos
Antes de iniciar este tutorial, você deve ter Visual Studio instalado em um computador executando Windows 10 com o modo desenvolvedor ligado. Se você não tiver Visual Studio, visite o link anterior para opções de download.
Você também deve ter uma conta pessoal da Microsoft com uma caixa de correio em Outlook.com, ou uma conta de trabalho ou de estudante da Microsoft. Se você não tiver uma conta da Microsoft, há algumas opções para obter uma conta gratuita:
- Você pode se inscrever em uma nova conta pessoal da Microsoft.
- Você pode se inscrever no programa Microsoft 365 desenvolvedor para obter uma assinatura Microsoft 365 gratuita.
Observação
Este tutorial foi escrito com Visual Studio versão 16.8.3 de 2019. As etapas neste guia podem funcionar com outras versões, mas que não foram testadas.
Comentários
Forneça qualquer comentário sobre este tutorial no repositório GitHub.
Criar um aplicativo da Plataforma Universal do Windows
Nesta seção, você criará um novo aplicativo UWP.
Abra o Visual Studio e selecione Criar um novo projeto. Escolha a opção Aplicativo em Branco (Universal Windows) que usa C# e selecione Próximo.
Na caixa de diálogo Configurar seu novo projeto, insira o campo Project nome
GraphTutorial
e selecione Criar.Importante
Certifique-se de inserir exatamente o mesmo nome para o Visual Studio Project especificado nessas instruções de laboratório. O nome do projeto Visual Studio torna-se parte do namespace no código. O código dentro dessas instruções depende do namespace correspondente ao nome do projeto Visual Studio especificado nessas instruções. Se você usar um nome de projeto diferente, o código não será compilado, a menos que você ajuste todos os namespaces para corresponder ao nome do projeto do Visual Studio inserido ao criar o projeto.
Selecione OK. Na caixa de diálogo Novo Windows Plataforma Universal Project, verifique se a versão Mínima está definida como ou posterior e
Windows 10, Version 1809 (10.0; Build 17763)
selecione OK.
Instalar pacotes NuGet
Antes de continuar, instale alguns pacotes NuGet que você usará posteriormente.
- Microsoft. Toolkit. Uwp.Ui.Controls.DataGrid para exibir as informações retornadas pela Microsoft Graph.
- Microsoft. Toolkit. Graph. Controles para lidar com a recuperação de token de logon e acesso.
Selecione Ferramentas> Gerenciador de pacotes NuGet> Console do gerenciador de pacotes. No Console do Gerenciador de Pacotes, digite os seguintes comandos.
Install-Package Microsoft.Toolkit.Uwp.Ui.Controls.DataGrid -IncludePrerelease Install-Package Microsoft.Toolkit.Graph.Controls -IncludePrerelease
Design do aplicativo
Nesta seção, você criará a interface do usuário do aplicativo.
Comece adicionando uma variável de nível de aplicativo para controlar o estado de autenticação. No Explorador de Soluções, expanda App.xaml e abra App.xaml.cs. Adicione a propriedade a seguir à classe
App
.public bool IsAuthenticated { get; set; }
Defina o layout da página principal. Abra
MainPage.xaml
e substitua todo o conteúdo pelo seguinte.<Page x:Class="GraphTutorial.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:GraphTutorial" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:controls="using:Microsoft.Toolkit.Uwp.UI.Controls" xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" xmlns:providers="using:Microsoft.Toolkit.Graph.Providers" xmlns:wgt="using:Microsoft.Toolkit.Graph.Controls" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Interactivity:Interaction.Behaviors> <providers:InteractiveProviderBehavior x:Name="MsalProvider" /> </Interactivity:Interaction.Behaviors> <Grid> <NavigationView x:Name="NavView" IsSettingsVisible="False" ItemInvoked="NavView_ItemInvoked"> <NavigationView.Header> <wgt:LoginButton x:Name="Login" VerticalAlignment="Top" HorizontalAlignment="Right" /> </NavigationView.Header> <NavigationView.MenuItems> <NavigationViewItem Content="Home" x:Name="Home" Tag="home"> <NavigationViewItem.Icon> <FontIcon Glyph=""/> </NavigationViewItem.Icon> </NavigationViewItem> <NavigationViewItem Content="Calendar" x:Name="Calendar" Tag="calendar"> <NavigationViewItem.Icon> <FontIcon Glyph=""/> </NavigationViewItem.Icon> </NavigationViewItem> <NavigationViewItem Content="New event" x:Name="NewEvent" Tag="newevent"> <NavigationViewItem.Icon> <FontIcon Glyph=""/> </NavigationViewItem.Icon> </NavigationViewItem> </NavigationView.MenuItems> <StackPanel> <controls:InAppNotification x:Name="Notification" ShowDismissButton="true" /> <Frame x:Name="RootFrame" Margin="24, 0" /> </StackPanel> </NavigationView> </Grid> </Page>
Isso define um navigationView básico com links de navegação home, calendário e novo evento para atuar como a exibição principal do aplicativo. Ele também adiciona um controle LoginButton no header do exibição. Esse controle permitirá que o usuário entre e saia. O controle ainda não está totalmente habilitado, você o configurará em um exercício posterior.
Clique com o botão direito do mouse no projeto de tutorial gráfico no Explorador de Soluções e selecione Adicionar > Novo Item.... Escolha Página em Branco, insira no campo
HomePage.xaml
Nome e selecione Adicionar. Substitua o elemento<Grid>
existente no arquivo pelo seguinte.<Grid> <StackPanel> <TextBlock FontSize="44" FontWeight="Bold" Margin="0, 12">Microsoft Graph UWP Tutorial</TextBlock> <TextBlock x:Name="HomePageMessage">Please sign in to continue.</TextBlock> </StackPanel> </Grid>
Expanda MainPage.xaml no Explorador de Soluções e abra
MainPage.xaml.cs
. Adicione a seguinte função à classeMainPage
para gerenciar o estado de autenticação.private void SetAuthState(bool isAuthenticated) { (Application.Current as App).IsAuthenticated = isAuthenticated; // Toggle controls that require auth Calendar.IsEnabled = isAuthenticated; NewEvent.IsEnabled = isAuthenticated; }
Adicione o código a seguir ao
MainPage()
construtor após athis.InitializeComponent();
linha.// Initialize auth state to false SetAuthState(false); // Configure MSAL provider // TEMPORARY MsalProvider.ClientId = "11111111-1111-1111-1111-111111111111"; // Navigate to HomePage.xaml RootFrame.Navigate(typeof(HomePage));
Quando o aplicativo é iniciado pela primeira vez, ele inicializa o estado de autenticação para
false
e navega até a home page.Adicione o seguinte manipulador de eventos para carregar a página solicitada quando o usuário selecionar um item no modo de exibição de navegação.
private void NavView_ItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args) { var invokedItem = args.InvokedItem as string; switch (invokedItem.ToLower()) { case "new event": throw new NotImplementedException(); break; case "calendar": throw new NotImplementedException(); break; case "home": default: RootFrame.Navigate(typeof(HomePage)); break; } }
Salve todas as alterações e pressione F5 ou selecione Depurar > Iniciar a Depuração em Visual Studio.
Observação
Selecione a configuração apropriada para seu computador (ARM, x64, x86).
Registrar o aplicativo no portal
Neste exercício, você criará um novo aplicativo nativo do Azure AD usando o Azure Active Directory de administração.
Abra um navegador, navegue até o centro de administração do Azure Active Directory e faça logon usando uma conta pessoal (também conhecida como conta da Microsoft) ou Conta Corporativa ou de Estudante.
Selecione Azure Active Directory na navegação esquerda e selecione Registros de aplicativos em Gerenciar.
Selecione Novo registro. Na página Registrar um aplicativo, defina os valores da seguinte forma.
- Defina Nome para
UWP Graph Tutorial
. - Defina Tipos de conta com suporte para Contas em qualquer diretório organizacional e contas pessoais da Microsoft.
- Em URI de redirecionamento, altere o menu suspenso para Cliente Público (área de trabalho móvel &) e de definir o valor como
https://login.microsoftonline.com/common/oauth2/nativeclient
.
- Defina Nome para
Selecione Registrar. Na página Tutorial Graph UWP, copie o valor da ID do Aplicativo (cliente) e salve-a, você precisará dele na próxima etapa.
Adicionar autenticação do Azure AD
Neste exercício, você estenderá o aplicativo do exercício anterior para dar suporte à autenticação com o Azure AD. Isso é necessário para obter o token de acesso OAuth necessário para chamar o microsoft Graph. Nesta etapa, você integrará o controle LoginButton do Windows Graph Controles no aplicativo.
Clique com o botão direito do mouse no projeto GraphTutorial no Explorador de Soluções e selecione Adicionar > Novo Item.... Escolha Arquivo de Recursos (.resw), nomee o arquivo e selecione
OAuth.resw
Adicionar. Quando o novo arquivo for aberto Visual Studio, crie dois recursos da seguinte forma.- Nome:
AppId
, Valor: a ID do aplicativo que você gerou no Portal de Registro de Aplicativos - Nome:
Scopes
, Valor:User.Read User.ReadBasic.All People.Read MailboxSettings.Read Calendars.ReadWrite
Importante
Se você estiver usando o controle de origem, como git, agora seria um bom momento para excluir o arquivo do controle de origem para evitar o vazamento
OAuth.resw
inadvertida da ID do aplicativo.- Nome:
Configurar o controle LoginButton
Abra
MainPage.xaml.cs
e adicione ausing
instrução a seguir à parte superior do arquivo.using Microsoft.Toolkit.Graph.Providers;
Substitua o construtor existente pelo seguinte.
public MainPage() { this.InitializeComponent(); // Load OAuth settings var oauthSettings = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView("OAuth"); var appId = oauthSettings.GetString("AppId"); var scopes = oauthSettings.GetString("Scopes"); if (string.IsNullOrEmpty(appId) || string.IsNullOrEmpty(scopes)) { Notification.Show("Could not load OAuth Settings from resource file."); } else { // Configure MSAL provider MsalProvider.ClientId = appId; MsalProvider.Scopes = new ScopeSet(scopes.Split(' ')); // Handle auth state change ProviderManager.Instance.ProviderUpdated += ProviderUpdated; // Navigate to HomePage.xaml RootFrame.Navigate(typeof(HomePage)); } }
Este código carrega as configurações de
OAuth.resw
e inicializa o provedor MSAL com esses valores.Agora adicione um manipulador de eventos
ProviderUpdated
para o evento noProviderManager
. Adicione a função a seguir à classeMainPage
.private void ProviderUpdated(object sender, ProviderUpdatedEventArgs e) { var globalProvider = ProviderManager.Instance.GlobalProvider; SetAuthState(globalProvider != null && globalProvider.State == ProviderState.SignedIn); RootFrame.Navigate(typeof(HomePage)); }
Esse evento é acionado quando o provedor muda ou quando o estado do provedor muda.
No Explorador de Soluções, expanda HomePage.xaml e abra
HomePage.xaml.cs
. Substitua o construtor existente pelo seguinte.public HomePage() { this.InitializeComponent(); if ((App.Current as App).IsAuthenticated) { HomePageMessage.Text = "Welcome! Please use the menu to the left to select a view."; } }
Reinicie o aplicativo e clique no controle Entrar na parte superior do aplicativo. Depois de entrar, a interface do usuário deve mudar para indicar que você se inscreveu com êxito.
Observação
O
ButtonLogin
controle implementa a lógica de armazenar e atualizar o token de acesso para você. Os tokens são armazenados em armazenamento seguro e atualizados conforme necessário.
Obter um modo de exibição de calendário
Neste exercício, você incorporará o microsoft Graph no aplicativo. Para este aplicativo, você usará a Biblioteca de Clientes do Microsoft Graph para .NET para fazer chamadas para o Microsoft Graph.
Obtenha eventos de calendário do Outlook
Adicione uma nova página para o exibição de calendário. Clique com o botão direito do mouse no projeto GraphTutorial no Explorador de Soluções e selecione Adicionar > Novo Item.... Escolha Página em Branco, insira no campo
CalendarPage.xaml
Nome e selecione Adicionar.Abra
CalendarPage.xaml
e adicione a seguinte linha dentro do elemento<Grid>
existente.<TextBlock x:Name="Events" TextWrapping="Wrap"/>
Abra
CalendarPage.xaml.cs
e adicione as instruções a seguir na parte superior dousing
arquivo.using Microsoft.Graph; using Microsoft.Toolkit.Graph.Providers; using Microsoft.Toolkit.Uwp.UI.Controls; using Newtonsoft.Json;
Adicione as seguintes funções à
CalendarPage
classe.private void ShowNotification(string message) { // Get the main page that contains the InAppNotification var mainPage = (Window.Current.Content as Frame).Content as MainPage; // Get the notification control var notification = mainPage.FindName("Notification") as InAppNotification; notification.Show(message); } protected override async void OnNavigatedTo(NavigationEventArgs e) { // Get the Graph client from the provider var graphClient = ProviderManager.Instance.GlobalProvider.Graph; try { // Get the user's mailbox settings to determine // their time zone var user = await graphClient.Me.Request() .Select(u => new { u.MailboxSettings }) .GetAsync(); var startOfWeek = GetUtcStartOfWeekInTimeZone(DateTime.Today, user.MailboxSettings.TimeZone); var endOfWeek = startOfWeek.AddDays(7); var queryOptions = new List<QueryOption> { new QueryOption("startDateTime", startOfWeek.ToString("o")), new QueryOption("endDateTime", endOfWeek.ToString("o")) }; // Get the events var events = await graphClient.Me.CalendarView.Request(queryOptions) .Header("Prefer", $"outlook.timezone=\"{user.MailboxSettings.TimeZone}\"") .Select(ev => new { ev.Subject, ev.Organizer, ev.Start, ev.End }) .OrderBy("start/dateTime") .Top(50) .GetAsync(); // TEMPORARY: Show the results as JSON Events.Text = JsonConvert.SerializeObject(events.CurrentPage); } catch (ServiceException ex) { ShowNotification($"Exception getting events: {ex.Message}"); } base.OnNavigatedTo(e); } private static DateTime GetUtcStartOfWeekInTimeZone(DateTime today, string timeZoneId) { TimeZoneInfo userTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); // Assumes Sunday as first day of week int diff = System.DayOfWeek.Sunday - today.DayOfWeek; // create date as unspecified kind var unspecifiedStart = DateTime.SpecifyKind(today.AddDays(diff), DateTimeKind.Unspecified); // convert to UTC return TimeZoneInfo.ConvertTimeToUtc(unspecifiedStart, userTimeZone); }
Considere com o código em
OnNavigatedTo
está fazendo.- O URL que será chamado é
/me/calendarview
.- Os
startDateTime
endDateTime
parâmetros e definem o início e o fim do exibição de calendário. - O header faz com que os eventos sejam
Prefer: outlook.timezone
start
end
retornados no fuso horário do usuário. - A
Select
função limita os campos retornados para cada evento para apenas aqueles que o aplicativo realmente usará. - A
OrderBy
função classifica os resultados pela data e hora de início. - A
Top
função solicita no máximo 50 eventos.
- Os
- O URL que será chamado é
Modifique
NavView_ItemInvoked
o método no arquivo para substituir aMainPage.xaml.cs
instrução existente peloswitch
seguinte.switch (invokedItem.ToLower()) { case "new event": throw new NotImplementedException(); break; case "calendar": RootFrame.Navigate(typeof(CalendarPage)); break; case "home": default: RootFrame.Navigate(typeof(HomePage)); break; }
Agora você pode executar o aplicativo, entrar e clicar no item de navegação Calendário no menu à esquerda. Você deve ver um despejo JSON dos eventos no calendário do usuário.
Exibir os resultados
Substitua todo o conteúdo
CalendarPage.xaml
do pelo seguinte.<Page x:Class="GraphTutorial.CalendarPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:GraphTutorial" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:controls="using:Microsoft.Toolkit.Uwp.UI.Controls" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid> <controls:DataGrid x:Name="EventList" Grid.Row="1" AutoGenerateColumns="False"> <controls:DataGrid.Columns> <controls:DataGridTextColumn Header="Organizer" Width="SizeToCells" Binding="{Binding Organizer.EmailAddress.Name}" FontSize="20" /> <controls:DataGridTextColumn Header="Subject" Width="SizeToCells" Binding="{Binding Subject}" FontSize="20" /> <controls:DataGridTextColumn Header="Start" Width="SizeToCells" Binding="{Binding Start.DateTime}" FontSize="20" /> <controls:DataGridTextColumn Header="End" Width="SizeToCells" Binding="{Binding End.DateTime}" FontSize="20" /> </controls:DataGrid.Columns> </controls:DataGrid> </Grid> </Page>
Abra
CalendarPage.xaml.cs
e substitua a linha peloEvents.Text = JsonConvert.SerializeObject(events.CurrentPage);
seguinte.EventList.ItemsSource = events.CurrentPage.ToList();
Se você executar o aplicativo agora e selecionar o calendário, deverá obter uma lista de eventos em uma grade de dados. No entanto, os valores Start e End são exibidos de maneira não amigável. Você pode controlar como esses valores são exibidos usando um conversor de valor.
Clique com o botão direito do mouse no projeto GraphTutorial no Explorador de Soluções e selecione Adicionar > Classe.... Nomeia a
GraphDateTimeTimeZoneConverter.cs
classe e selecione Adicionar. Substitua todo o conteúdo do arquivo pelo seguinte.using Microsoft.Graph; using Microsoft.Graph.Extensions; using System; namespace GraphTutorial { class GraphDateTimeTimeZoneConverter : Windows.UI.Xaml.Data.IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { DateTimeTimeZone date = value as DateTimeTimeZone; if (date != null) { return date.ToDateTime().ToString(); } return string.Empty; } public object ConvertBack(object value, Type targetType, object parameter, string language) { throw new NotImplementedException(); } } }
Esse código pega a estrutura dateTimeTimeZone retornada pela Microsoft Graph e a analisará em um
DateTimeOffset
objeto. Em seguida, ele converte o valor no fuso horário do usuário e retorna o valor formatado.Abra
CalendarPage.xaml
e adicione o seguinte antes do<Grid>
elemento.<Page.Resources> <local:GraphDateTimeTimeZoneConverter x:Key="DateTimeTimeZoneValueConverter" /> </Page.Resources>
Substitua os dois últimos
DataGridTextColumn
elementos pelo seguinte.<controls:DataGridTextColumn Header="Start" Width="SizeToCells" Binding="{Binding Start, Converter={StaticResource DateTimeTimeZoneValueConverter}}" FontSize="20" /> <controls:DataGridTextColumn Header="End" Width="SizeToCells" Binding="{Binding End, Converter={StaticResource DateTimeTimeZoneValueConverter}}" FontSize="20" />
Execute o aplicativo, entre e clique no item de navegação Calendário. Você deve ver a lista de eventos com os valores Start e End formatados.
Criar um novo evento
Nesta seção, você adicionará a capacidade de criar eventos no calendário do usuário.
Adicione uma nova página para o novo exibição de evento. Clique com o botão direito do mouse no projeto GraphTutorial no Explorador de Soluções e selecione Adicionar > Novo Item.... Escolha Página em Branco, insira no campo
NewEventPage.xaml
Nome e selecione Adicionar.Abra NewEventPage.xaml e substitua seu conteúdo pelo seguinte.
<Page xmlns:wgt="using:Microsoft.Toolkit.Graph.Controls" x:Class="GraphTutorial.NewEventPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:GraphTutorial" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <StackPanel Margin="10" Spacing="10"> <TextBox Header="Subject" Text="{Binding Subject, Mode=TwoWay}" /> <TextBlock Text="Attendees"/> <wgt:PeoplePicker Name="AttendeePicker" /> <Grid ColumnSpacing="10" RowSpacing="10"> <Grid.ColumnDefinitions> <ColumnDefinition Width="auto" /> <ColumnDefinition Width="auto" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="auto" /> <RowDefinition Height="auto" /> </Grid.RowDefinitions> <DatePicker Header="Start Date" Date="{Binding StartDate, Mode=TwoWay}" /> <TimePicker Header="Start Time" Time="{Binding StartTime, Mode=TwoWay}" Grid.Column="2" /> <DatePicker Header="End Date" Date="{Binding EndDate, Mode=TwoWay}" Grid.Row="2" /> <TimePicker Header="End Time" Time="{Binding EndTime, Mode=TwoWay}" Grid.Row="2" Grid.Column="2" /> </Grid> <TextBox Header="Body" Text="{Binding Body, Mode=TwoWay}" AcceptsReturn="True" TextWrapping="Wrap" Height="200" ScrollViewer.VerticalScrollBarVisibility="Auto" /> <Button Content="Create" Click="CreateEvent" IsEnabled="{Binding IsValid}"/> <ProgressRing Name="CreateProgress" Visibility="Collapsed" IsActive="False" /> </StackPanel> </Page>
Abra NewEventPage.xaml.cs e adicione as instruções a seguir à
using
parte superior do arquivo.using System.ComponentModel; using Microsoft.Graph; using Microsoft.Graph.Extensions; using Microsoft.Toolkit.Graph.Providers; using Microsoft.Toolkit.Uwp.UI.Controls; using System.Runtime.CompilerServices;
Adicione a interface INotifyPropertyChange à classe NewEventPage. Substitua a declaração de classe existente pelo seguinte.
public sealed partial class NewEventPage : Page, INotifyPropertyChanged { public NewEventPage() { this.InitializeComponent(); DataContext = this; } }
Adicione as seguintes propriedades à classe NewEventPage.
private TimeZoneInfo _userTimeZone = null; // Value of the Subject text box private string _subject = ""; public string Subject { get { return _subject; } set { _subject = value; OnPropertyChanged(); } } // Value of the Start date picker private DateTimeOffset _startDate = DateTimeOffset.Now; public DateTimeOffset StartDate { get { return _startDate; } set { _startDate = value; OnPropertyChanged(); } } // Value of the Start time picker private TimeSpan _startTime = TimeSpan.Zero; public TimeSpan StartTime { get { return _startTime; } set { _startTime = value; OnPropertyChanged(); } } // Value of the End date picker private DateTimeOffset _endDate = DateTimeOffset.Now; public DateTimeOffset EndDate { get { return _endDate; } set { _endDate = value; OnPropertyChanged(); } } // Value of the End time picker private TimeSpan _endTime = TimeSpan.Zero; public TimeSpan EndTime { get { return _endTime; } set { _endTime = value; OnPropertyChanged(); } } // Value of the Body text box private string _body = ""; public string Body { get { return _body; } set { _body = value; OnPropertyChanged(); } } // Combine the date from date picker with time from time picker private DateTimeOffset CombineDateAndTime(DateTimeOffset date, TimeSpan time) { // Use the year, month, and day from the supplied DateTimeOffset // to create a new DateTime at midnight var dt = new DateTime(date.Year, date.Month, date.Day); // Add the TimeSpan, and use the user's timezone offset return new DateTimeOffset(dt + time, _userTimeZone.BaseUtcOffset); } // Combined value of Start date and time pickers public DateTimeOffset Start { get { return CombineDateAndTime(StartDate, StartTime); } } // Combined value of End date and time pickers public DateTimeOffset End { get { return CombineDateAndTime(EndDate, EndTime); } } public bool IsValid { get { // Subject is required, Start must be before // End return !string.IsNullOrWhiteSpace(Subject) && DateTimeOffset.Compare(Start, End) < 0; } }
Adicione o código a seguir para obter o fuso horário do usuário da Microsoft Graph quando a página for carregada.
protected override async void OnNavigatedTo(NavigationEventArgs e) { // Get the Graph client from the provider var graphClient = ProviderManager.Instance.GlobalProvider.Graph; try { // Get the user's mailbox settings to determine // their time zone var user = await graphClient.Me.Request() .Select(u => new { u.MailboxSettings }) .GetAsync(); _userTimeZone = TimeZoneInfo.FindSystemTimeZoneById(user.MailboxSettings.TimeZone); } catch (ServiceException graphException) { ShowNotification($"Exception getting user's mailbox settings from Graph, defaulting to local time zone: {graphException.Message}"); _userTimeZone = TimeZoneInfo.Local; } catch (Exception ex) { ShowNotification($"Exception loading time zone from system: {ex.Message}"); } } private void ShowNotification(string message) { // Get the main page that contains the InAppNotification var mainPage = (Window.Current.Content as Frame).Content as MainPage; // Get the notification control var notification = mainPage.FindName("Notification") as InAppNotification; notification.Show(message); }
Adicione o código a seguir para criar o evento.
private async void CreateEvent(object sender, RoutedEventArgs e) { CreateProgress.IsActive = true; CreateProgress.Visibility = Visibility.Visible; // Get the Graph client from the provider var graphClient = ProviderManager.Instance.GlobalProvider.Graph; // Initialize a new Event object with the required fields var newEvent = new Event { Subject = Subject, Start = Start.ToDateTimeTimeZone(_userTimeZone), End = End.ToDateTimeTimeZone(_userTimeZone) }; // If there's a body, add it if (!string.IsNullOrEmpty(Body)) { newEvent.Body = new ItemBody { Content = Body, ContentType = BodyType.Text }; } // Add any attendees var peopleList = AttendeePicker.Items.ToList(); var attendeeList = new List<Attendee>(); foreach (object entry in peopleList) { // People Picker can contain Microsoft.Graph.Person objects // or text entries (for email addresses not found in the user's people list) if (entry is Person) { var person = entry as Person; attendeeList.Add(new Attendee { Type = AttendeeType.Required, EmailAddress = new EmailAddress { Address = person.EmailAddresses.First().Address } }); } else if (entry is ITokenStringContainer) { var container = entry as ITokenStringContainer; // Treat any unrecognized text as a list of email addresses var emails = container.Text .Split(new[] { ';', ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); foreach (var email in emails) { try { // Validate the email address var addr = new System.Net.Mail.MailAddress(email); if (addr.Address == email) { attendeeList.Add(new Attendee { Type = AttendeeType.Required, EmailAddress = new EmailAddress { Address = email } }); } } catch { /* Invalid, skip */ } } } } if (attendeeList.Count > 0) { newEvent.Attendees = attendeeList; } try { await graphClient.Me.Events.Request().AddAsync(newEvent); } catch (ServiceException graphException) { ShowNotification($"Exception creating new event: ${graphException.Message}"); } CreateProgress.IsActive = false; CreateProgress.Visibility = Visibility.Collapsed; ShowNotification("Event created"); }
Modifique
NavView_ItemInvoked
o método no arquivo MainPage.xaml.cs para substituir a instrução existenteswitch
pelo seguinte.switch (invokedItem.ToLower()) { case "new event": RootFrame.Navigate(typeof(NewEventPage)); break; case "calendar": RootFrame.Navigate(typeof(CalendarPage)); break; case "home": default: RootFrame.Navigate(typeof(HomePage)); break; }
Salve suas alterações e execute o aplicativo. Entre, selecione o item de menu Novo evento, preencha o formulário e selecione Criar para adicionar um evento ao calendário do usuário.
Parabéns!
Você concluiu o tutorial do Microsoft Graph UWP. Agora que você tem um aplicativo de trabalho que chama a Microsoft Graph, você pode experimentar e adicionar novos recursos. Visite a visão geral do microsoft Graph para ver todos os dados que você pode acessar com o Microsoft Graph.
Comentários
Forneça qualquer comentário sobre este tutorial no repositório GitHub .
Tem algum problema com essa seção? Se tiver, envie seus comentários para que possamos melhorar esta seção.