Curso Windows Phone – Como salvar um arquivo de imagem no sistema de arquivos da APP

Olá pessoal, tudo bom?

A transição entre o Windows Phone 7, 7.5, 8, 8.1 e agora o Windows Phone 10 (também se encaixam aqui as Universal APPs) trouxe mudanças no modo como codificamos alguns recursos para as APPs, sendo um deles, o método para armazenamento de arquivos no StorageFolder (IsolatedStorageFile) da própria aplicação.

Dada essa situação e também para responder a dúvida de um leitor, resolvi escrever esse post que tem por objetivo demonstrar como armazenar um arquivo de imagem no StorageFolder da APP.

PS: O procedimento para armazenar outros tipos de arquivos seria similar a esse

A codificação abaixo parte do pressuposto que você já possui um arquivo de imagem instanciado em um objeto da classe WriteableBitmap e que o mesmo é passado por parâmetro para nosso método que irá persisti-lo no sistema de arquivos da APP. Vejamos:


async private void SaveImage(WriteableBitmap wb)
{
  try
    {
      //Mapeando o sistema de arquivos local da APP
      StorageFolder folder = ApplicationData.Current.LocalFolder;
      //Definindo o diretório dentro sistema de arquivos local que receberá as imagens
      StorageFolder imgFolder = await folder.CreateFolderAsync("Images", CreationCollisionOption.OpenIfExists);
      //Definindo o objeto do arquivo a ser persistido
      StorageFile file = await imgFolder.CreateFileAsync("file_name", CreationCollisionOption.ReplaceExisting);

      //Definindo o tipo do arquivo de imagem
      Guid BitmapEnconderGuid = BitmapEncoder.JpegEncoderId;
      //Gravando o arquivo
      using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
      {
        BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEnconderGuid, stream);

        Stream pixelStream = wb.PixelBuffer.AsStream();
        byte[] pixels = new byte[pixelStream.Length];
        await pixelStream.ReadAsync(pixels, 0, pixels.Length);

        encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore,
             (uint)wb.PixelWidth,
             (uint)wb.PixelHeight,
             96.0,
             96.0,
             pixels);
        await encoder.FlushAsync();
      }

      var dialog = new MessageDialog("Image stored successfully.", "Information");
      await dialog.ShowAsync();
    }
    catch (Exception)
    {
      throw new FileNotFoundException();
    }
}

Abraços,

Eduardo Henrique Rizo

MCP

Post Relacionado: 

Marcado com: , , , , , , , , , , , , , , , , ,
Publicado em Universal APPs, Windows Phone

Síntese: Modelo de Gerenciamento de Rede – ISO (7498-4)

De acordo com a ISO (ISO 7498-4), a gerência de redes pode ser classificada em cinco áreas funcionais: gerência de falhas, gerência de contabilização, gerência de configuração, gerência de desempenho e gerência de segurança. Embora esta classificação, geralmente referenciada como FCAPS (Fault, Configuration, Accounting, Performance and Security), tenha sido desenvolvida para o modelo OSI, houve uma grande aceitação desta por parte dos fabricantes de hardware e software de rede, tanto em tecnologias padronizadas como em proprietárias.

O FCAPS serve de base por definir áreas funcionais da gerência de redes:

  • Gerência de falhas: detecta, isola, notifica e corrige operações anormais no funcionamento dos recursos de rede;
  • Gerência de configuração: responsável pelo registro, manutenção dos parâmetros de configuração dos serviços da rede e implementação de facilidades para atualização ou modificação dos recursos de rede, tais como versões de hardware e de software;
  • Gerência de contabilização: registra o uso da rede por parte de seus usuários com objetivo de cobrança ou regulamentação, isto é, implementa facilidades para alocação dos recursos e definição de métricas para uso dos mesmos;
  • Gerência de desempenho: responsável pela medição e disponibilização das informações de desempenho dos serviços de rede. Estes dados são usados para garantir que a rede opere em conformidade com a qualidade do serviço acordado com os seus usuários e para análise de tendência;
  • Gerência de segurança: restringe o acesso à rede e impede o uso incorreto por parte de seus usuários, de forma intencional ou não, protegendo a operação dos recursos de rede.

Gerência de Falhas (Fault)

Falhas não são o mesmo que erros. Uma falha é uma condição anormal cuja recuperação exige ação de gerenciamento e normalmente é causada por operações incorretas ou um número excessivo de erros. Por exemplo, se uma linha de comunicação é cortada fisicamente, nenhum sinal pode passar através dela. Um grampeamento no cabo pode causar distorções que induzem a uma alta taxa de erros. Certos erros como, por exemplo, um bit errado em uma linha de comunicação, podem ocorrer ocasionalmente e normalmente não são considerados falhas [6].

Para controlar o sistema como um todo, cada componente essencial deve ser monitorado individualmente para garantir o seu perfeito funcionamento. Quando ocorre uma falha, é importante que seja possível, rapidamente:

  • Determinar o componente exato onde a falha ocorreu;
  • Isolar a falha do resto da rede, para que ela continue a funcionar sem interferências;
  • Reconfigurar ou modificar a rede para minimizar o impacto da operação sem o componente que falhou;
  • Reparar ou trocar o componente com problemas para restaurar a rede ao seu estado anterior.

A gerência de falhas tem, portanto, três grandes responsabilidades: o monitoramento dos estados dos recursos da rede, a manutenção de cada um dos objetos gerenciados e as decisões que devem ser tomadas para restabelecer as unidades do sistema que possam apresentar problemas. O ideal é que, as falhas que possam ocorrer, sejam detectadas antes que os seus efeitos sejam percebidos.

O impacto e a duração do estado de falha podem ser minimizados pelo uso de componentes redundantes e rotas de comunicação alternativas, para dar à rede um maior grau de tolerância às falhas.

Gerência de Configuração (Configuration)

O gerenciamento de configuração está relacionado à inicialização da rede e com uma eventual desabilitação de parte ou de toda a rede. Também está relacionado às tarefas de manutenção, adição e atualização de relacionamentos entre os componentes e da situação dos componentes durante a operação da rede [6].

O gerente da rede deve ser capaz de, identificar os componentes da rede e definir a conectividade entre eles, além de modificar a configuração em resposta às avaliações de desempenho, recuperação de falhas, problemas de segurança, atualização da rede ou para atender às necessidades dos usuários.

Gerência de Contabilização (Accounting)

Mesmo que nenhuma cobrança interna seja feita pela utilização dos recursos da rede, o administrador da rede deve estar habilitado para controlar o uso dos recursos por usuário ou grupo de usuários, com o objetivo de [6]:

  • Evitar que um usuário ou grupo abuse de seus privilégios de acesso e monopolize a rede, em detrimento de outros usuários;
  • Evitar que usuários façam uso ineficiente da rede, assistindo-os na troca de procedimentos e garantindo a desempenho da rede;
  • Conhecer as atividades dos usuários com detalhes suficientes para planejar o crescimento da rede.

O gerente da rede deve ser capaz de especificar os tipos de informações de contabilização que devem ser registrados em cada nó, o intervalo de entrega de relatórios para nós de gerenciamento de mais alto nível e os algoritmos usados no cálculo da utilização.

Gerência de desempenho (Performance)

O gerenciamento do desempenho consiste na monitoração das atividades e controle dos recursos através de ajustes e trocas, possibilitando a obtenção de informações para avaliar o comportamento dos recursos da rede através de determinados parâmetros como: nível de utilização, perfil de tráfego, vazão (throughput), existência de gargalos, tempo de resposta, latência (atrasos), jitter, disponibilidade, níveis de QoS (em redes MPLS), perdas de pacotes, entre outros [6].

Para tratar estas questões, o gerente deve focalizar um conjunto inicial de recursos a serem monitorados, a fim de estabelecer níveis de desempenho. Isto inclui associar métricas e valores apropriados aos recursos de rede que possam fornecer indicadores de diferentes níveis de desempenho. Muitos recursos devem ser monitorados para se obter informações sobre o nível de operação da rede. Colecionando e analisando estas informações, o gerente da rede pode ficar mais capacitado no reconhecimento de indicadores de degradação de desempenho.

As redes de computadores hoje são constituídas de uma variedade de dispositivos, de diferentes padrões, implementando diferentes protocolos, oferecendo diferentes níveis de serviço, e que devem se intercomunicar e compartilhar dados e recursos. Na maioria dos casos, a eficiência da aplicação que faz uso destes recursos está altamente relacionada ao bom desempenho da rede.

Estatísticas de desempenho podem ajudar no planejamento, administração e manutenção de grandes redes. Estas informações podem ser utilizadas para reconhecer situações de gargalo antes que elas causem problemas para o usuário final. Ações corretivas podem ser executadas, tais como: trocar tabelas de roteamento para balancear ou redistribuir a carga de tráfego durante horários de pico, priorizar tráfego/aplicações, ou ainda indicar a necessidade de expansão de links, roteadores e servidores.

O gerenciamento de desempenho, portanto, é importante não só para garantir a qualidade de serviço necessária às aplicações, como também para assegurar que ela possa ser atingida com os menores custos. Pode-se por meio do gerenciamento de desempenho adequar os meios de comunicação utilizados pelos usuários às suas reais necessidades, auxiliando o gerente da rede a antecipar-se aos usuários na manutenção dos níveis de desempenho dos serviços oferecidos.

Dentre as atividades mais importantes da gerência de desempenho de redes, pode-se citar: monitoramento do desempenho, caracterização de carga de trabalho (perfil de tráfego ou workload), ajuste de parâmetros do sistema, identificação de gargalos, comparação de desempenho entre sistemas alternativos, dimensionamento de componentes do sistema, previsão de crescimento e tendências.

Gerência de Segurança (Security)

O gerenciamento da segurança provê facilidades para proteger recursos da rede e informações dos usuários, que devem estar disponíveis apenas para usuários autorizados. É necessário que a política de segurança seja robusta e efetiva e que o sistema de gerenciamento da segurança seja, ele próprio, seguro [6].
O gerenciamento de segurança trata de questões como:

  • Geração, distribuição e armazenamento de chaves de criptografia;
  • Manutenção e distribuição de senhas e informações de controle de acesso;
  • Monitoração e controle de acesso à rede ou parte dela e das informações obtidas dos nós da rede;
  • Coleta, armazenamento e exame de registros de auditoria e logs de segurança, bem como ativação e desativação destas atividades.

Fonte: http://www.teleco.com.br/tutoriais/tutorialgmredes1/pagina_3.asp

Grande abraço,
Eduardo Henrique Rizo

Marcado com: , , ,
Publicado em Gerenciamento de Redes, Gerenciamento de Serviços de TI

Curso Windows Phone – Como converter um objeto StorageFile para um BitmapImage

Segue uma dica para converter um arquivo armazenado localmente no Windows Phone (ou Universal APPs) para um objeto do tipo BitmapImage.

Em primeiro lugar devemos recuperar o arquivo da imagem e armazena-lo em um objeto do tipo StorageFile. Exemplo:

string nomeArquivo = "teste";
//O objeto folder irá representar o "sistema de arquivos" da APP
StorageFolder folder = ApplicationData.Current.LocalFolder;
//O objeto imgFolder irá representar o diretório onde as imagens estão armazenadas
StorageFolder imgFolder = await folder.GetFolderAsync("Images"); //Supondo que os arquivos de imagens fiquem no diretório de nome Images
//O objeto file representa o arquivo da imagem que você está recuperando
StorageFile file = await imgFolder.GetFileAsync(nomeArquivo);
Depois de obter o arquivo e coloca-lo em um objeto do tipo StorageFile, basta fazer a conversão para BitmapImage. Claro que para isso funcionar o arquivo recuperado anteriormente tem que ser do tipo de uma imagem. Exemplo:
//Esse trecho de código é continuação do anterior e o objeto file representa o arquivo recuperado
BitmapImage img = new BitmapImage(new Uri(file.Path, UriKind.Absolute));

Abraços,

Eduardo Henrique Rizo

MCP

Post Relacionado: 

Marcado com: , , , , , , , , , , , , , , ,
Publicado em Universal APPs, Windows Phone

Universal APPs – Como obter a resolução do dispositivo via código C#

Olá pessoal, tudo bom?

Dependendo da forma como o layout da APP está sendo construído, é importante conhecermos a resolução do dispositivo onde a mesma está sendo executada, para que tenhamos condições de realizar algum ajuste para quando as dimensões (em pixel) da tela forem maiores ou menores daquela que usamos para o desenvolvimento.

resolucao

O trecho de código abaixo demonstra uma forma de colhermos essa informação e então usá-la a nosso favor. Veja:


...

//Determinando a resolução da tela
var rawpixelperview = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel;
double width = Math.Round(Window.Current.Bounds.Width * rawpixelperview);
double heigth = Math.Round(Window.Current.Bounds.Height * rawpixelperview);

...

Abraços,

Eduardo Henrique Rizo

MCP

Marcado com: , , , , , , , , , , , ,
Publicado em Universal APPs

Universal APPs – Como fixar a orientação portrait ou landscape via código C#

Segue uma dica rápida para o caso de você precisar fixar ou trocar a orientação de uma página de uma APP via código C#.

orientacoes

Na página onde se deseja fixar/trocar a orientação, adicione a linha de código abaixo no construtor da página – MainPage()


...

DisplayInformation.AutoRotationPreferences = DisplayOrientations.Portrait | DisplayOrientations.PortraitFlipped;

...

O enumerator DisplayOrientations também conta com os valores Landscape e LandscapeFlipped. O “Flipped” significa dizer que o usuário rotacionou outros 90 graus em sentido horário.

Fica a dica!

Abraços,

Eduardo Henrique Rizo

MCP

 

Marcado com: , , , , , , , , , , ,
Publicado em Universal APPs

Falha de logon do serviço cliente da diretiva de grupo, acesso negado

Caso você tenha um servidor de terminais baseado no Windows 2008 e algum dos seus usuários esteja recebendo a mensagem “Falha de logon do serviço cliente da diretiva de grupo, acesso negado.”, uma das possibilidades é que o perfil do usuário esteja corrompido ou com permissão incorreta. Para corrigir essa situação, siga os procedimentos abaixo em seu servidor de TS:

  1. Abra o registro do Windows (regedit.exe)
    passo1
  2. Selecione a pasta HKEY_USERS
    passo2
  3. Clique no menu Arquivo e depois em Carregar Hive
    passo3
  4. Posicione-se no diretório do perfil do usuário que está com problema e dentro dele selecione o arquivo NTUSER.DAT. Geralmente os perfis dos usuários ficam alocados no diretório C:\Usuários
  5. Informe um nome para a chave. O nome pode ser o próprio nome do usuário
    passo4
  6. Pressione o botão direito sobre a nova Hive e clique em Permissões…
    passo5
  7. Verifique se as permissões estão de acordo com a lista abaixo:
    • SYSTEM – Controle Total
    • Administradores – Controle Total
    • Usuário dono do perfil – Controle Total
  8. Na mesma tela do passo 7, vá na em Avançado e marque para que o conjunto de permissões da raiz sobreponha as demais permissões dos outros arquivos
    passo6
  9. Para finalizar marque novamente a Hive que você criou no passo 5, depois clique no menu Arquivo e selecione a opção Descarregar Hive…

Grande abraço,
Eduardo Henrique Rizo

Fonte: Forum Technet

 

 

 

Marcado com: , , , , , , , , , ,
Publicado em Windows Server

Curso Windows Phone – Como ocultar o teclado após pressionar o ENTER em um TextBox

Olá, tudo bom?

Segue um post rápido para o caso de você estar desenvolvendo uma APP onde seja necessário ocultar o teclado após o usuário pressionar a tecla ENTER.

Tomarei como base a existência do TextBox declarado no trecho de código abaixo:

...
<TextBox Name="txtMeuTexto" KeyUp="txtMeuTexto_KeyUp" InputScope="Default" />
...

Repare que no TextBox foi declarado o evento Key_Up, onde verificamos todas as teclas pressionadas pelo usuário na caixa de texto. Quando ele pressionar o ENTER tiramos o foco do TextBox e colocamos de volta na página da APP, fazendo com o teclado virtual seja ocultado.

Veja o código em C#

private void txtMeuTexto_KeyUp(object sender, KeyRoutedEventArgs e)
{
  if (e.Key == Windows.System.VirtualKey.Enter)
  {
    this.Focus(FocusState.Keyboard);
  }
}

Abraços,

Eduardo Henrique Rizo

MCP

Post Relacionado: 

Marcado com: , , , , , , , , ,
Publicado em Windows Phone

Curso Windows Phone – Menu hamburger com XAML e C#

drawericonOlá pessoal, tudo bom?

Neste post demonstro como criar uma APP Windows Phone com o recurso do “menu hamburger”.

Para quem não conhece o termo, o “menu hamburger” é aquele menu lateral que desliza sobre a tela principal da APP, geralmente ao tocar sobre um ícone semelhante a um hamburger, cuidadosamente posicionado em alguma parte da tela de sua aplicação. Outra forma de fazer esse menu aparecer é quando se desliza o dedo da esquerda para a direita na tela do seu celular.

menu-hamburger

Dada a introdução sobre o assunto, vamos agora verificar o necessário para codificar esse recurso em nossa APP.

Passo 1: Fazer referencia ao recurso DrawerLayout via Nuget

No Visual Studio, selecione o menu Tools –> NuGet Package Manager –> Package Manager Console

No Package Manager Console digite: Install-Package DrawerLayout

nuget-drawerlayout

Passo 2: Codificação XAML

Faça uma declaração para o XML Namespace do recurso DrawerLayout na página XAML onde você irá inserir o “menu hamburger”


xmlns:drawerLayout="using:DrawerLayout"

Na sequencia, declare a codificação XAML de forma similar ao conteúdo do exemplo abaixo:


<!-- IMPORTANTE A LEITURA DOS COMENTÁRIOS NO CÓDIGO -->

<Grid x:Name="layoutPadrao" Background="DarkGray">
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="*" />
  </Grid.RowDefinitions>

  <!-- Definição da barra de título da APP -->
  <Grid x:Name="barraTitulo" Grid.Row="0" Height="70" Background="{StaticResource PhoneAccentBrush}">
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Image Grid.Column="0" HorizontalAlignment="Left"
           Tapped="Image_Tapped"
           Source="Assets/icon-menu.png" />
    <TextBlock Grid.Column="1" Foreground="White"
           Text="Blog do Eduardo H. Rizo"
           Style="{StaticResource SubheaderTextBlockStyle}"
           VerticalAlignment="Center" />
  </Grid>

  <!-- Definição do espaço reservado para
    o conteúdo principal da APP e para o
    menu hamburger -->
  <drawerLayout:DrawerLayout Grid.Row="1" x:Name="DrawerLayout">
    <!-- Conteúdo principal da APP -->
    <Grid x:Name="conteudoPrincipal" Margin="10,0,0,0">
      <TextBlock Text="Conteúdo principal da APP..." Style="{StaticResource SubheaderTextBlockStyle}" />
    </Grid>

    <!-- Conteúdo do menu hamburger -->
    <Grid x:Name="conteudoMenu" Background="White">
      <TextBlock Text="Opções do menu:" Padding="10"
           Foreground="Black"
           FontSize="24"
           Style="{StaticResource TitleTextBlockStyle}" />
      <ListView Name="lvOpcoesMenu" Margin="0,60,0,0" Tapped="lvOpcoesMenu_Tapped">
        <ListView.ItemTemplate>
          <DataTemplate>
            <TextBlock Text="{Binding}" Margin="15" HorizontalAlignment="Left"
                 VerticalAlignment="Center" FontSize="20"
                 Foreground="Black" />
          </DataTemplate>
        </ListView.ItemTemplate>
      </ListView>
    </Grid>
  </drawerLayout:DrawerLayout>
</Grid>

Passo 3: Codificação C#

Tendo feito a referência do passo 1 e as declarações XAML do passo 2, basta agora finalizar o exemplo com a codificação C# necessária para o mesmo.


//É IMPORTANTE A LEITURA DOS COMENTÁRIOS NO CÓDIGO

public MainPage()
{
  this.InitializeComponent();
  this.NavigationCacheMode = NavigationCacheMode.Required;

  //Inicialização do recurso DrawerLayout
  DrawerLayout.InitializeDrawerLayout();
  //Declaração de um vetor de opções fictícias de menu
  string[] opcoesMenu = new string[6] { "Opção 1", "Opção 2", "Opção 3", "Opção 4", "Opção 5", "Opção 6" };
  //Indicando o vetor de opções para o ListView que irá
  //exibir o menu dentro do espaço reservado para o menu hamburger
  lvOpcoesMenu.ItemsSource = opcoesMenu;
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
  //Tratando o toque o menu físico de voltar (back)
  //do Windows Phone para situações onde o usuário queira
  //fechar o menu através dele.
  Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
}

void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
{
  //Ao tocar no botão back do WP verificamos se
  //o menu está aberto para então fecha-lo ou sair da aplicação
  if (DrawerLayout.IsDrawerOpen)
  {
    DrawerLayout.CloseDrawer();
    e.Handled = true;
  }
  else
    Application.Current.Exit();
}

private void Image_Tapped(object sender, TappedRoutedEventArgs e)
{
  //Tratando o toque no ícone do menu hamburger
  //para abri-lo ou fecha-lo
  if (DrawerLayout.IsDrawerOpen)
    DrawerLayout.CloseDrawer();
  else
    DrawerLayout.OpenDrawer();
}

private async void lvOpcoesMenu_Tapped(object sender, TappedRoutedEventArgs e)
{
  //Tratamento para obter a opção do menu
  //hamburger selecionada pelo usuário
  var lv = sender as ListView;
  string opcao = lv.SelectedItem.ToString();
  var dialog = new MessageDialog(opcao, "Opção selecionada:");
  await dialog.ShowAsync();
}

Espero ter ajudado.

Abraços,

Eduardo Henrique Rizo

MCP

Post Relacionado: 

Marcado com: , , , , , , , , ,
Publicado em Windows Phone

Como habilitar o Hyper-V ou o VirtualBox através do boot do Windows 8.1

hyper-v_virtualboxA coexistência entre dois Hypervisors instalados no mesmo equipamento é algo normalmente não suportado pelo sistema operacional, mas se você está lendo esse post, é porque assim como eu, já teve VMs preparadas para o Hyper-V e outras preparadas para o VirtualBox ou outro virtualizador qualquer.

Bem, devo lhe dizer que dois Hypervisors com seus serviços habilitados no mesmo instante não irá funcionar, porém há uma forma fácil de dar o boot no seu sistema operacional e então escolher se você irá, por exemplo, subir o SO com o Hyper-V ou se você irá subir o SO sem o Hyper-V para então poder habilitar o outro virtualizador que você precisa.

A estratégia seria criar uma cópia do procedimento de boot do SO acrescentando uma nova opção de boot sem o Hyper-V.

Para executar o procedimento abaixo é necessário abrir o Prompt de Comando com privilégios administrativos.


C:\>bcdedit /copy {current} /d "No Hyper-V"
The entry was successfully copied to {ff-23-113-824e-5c5144ea}.

C:\>bcdedit /set {ff-23-113-824e-5c5144ea} hypervisorlaunchtype off
The operation completed successfully.

Como no Windows 8.X temos a característica do FAST Boot, sendo assim, devo informar que para você ter acesso à nova opção será necessário selecionar a opção de reiniciar seu computador já mantendo tecla Shift pressionada.

Quando seu computador reiniciar irá aparecer uma tela com opções de boot, sendo que nesse caso, você deve escolher a opção “Use another operating system” e então estará disponível a opção de boot “No Hyper-V” configurada no procedimento acima.

Para voltar à configuração normal do SO, basta reiniciar o computador normalmente.

Grande abraço,
Eduardo Henrique Rizo

Marcado com: , , , , , ,
Publicado em Hyper-V, Windows 8

Curso Windows Phone – Como consultar compromissos na agenda do Windows Phone

Calendar-DateOlá pessoal, tudo bom?

Segue uma dica rápida para que você possa, através de sua APP, consultar compromissos que estejam registrados na agenda do Windows Phone.

Para obter acesso aos agendamentos do usuário será necessário declarar o uso do namespace Microsoft.Phone.UserData, pois é através dele que passaremos a ter acesso à classe Appointments.

A classe Appointments, dentre outras coisas, nos permite reallizar consultas na agenda do Windows Phone e então exibir os compromissos registrados dentro de um determinado período de tempo.

Para nosso exemplo, estou declarando em XAML um DataTemplate que depois será associado a um ListBox. Esse conjunto será o responsável pela exibição dos dados na tela da APP.


<phone:PhoneApplicationPage
x:Class="Infoeste2015.Calendario"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True">

<!-- DEFINIÇÃO DO DATATEMPLATE PARA EXIBIÇÃO DOS DADOS DA AGENDA. -->
<phone:PhoneApplicationPage.Resources>
 <DataTemplate x:Key="AtividadesItemTemplate">
  <StackPanel Margin="0,0,0,25">
   <TextBlock FontWeight="Bold" Text="{Binding Subject}" Style="{StaticResource PhoneTextTitle2Style}" />
   <TextBlock Text="{Binding Details}" TextWrapping="Wrap" FontWeight="Bold" Style="{StaticResource PhoneTextTitle3Style}" />
   <StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding StartTime, StringFormat='{}{0:dd/MM/yyyy}'}" Style="{StaticResource PhoneTextTitle3Style}" />
    <TextBlock Text="a" Style="{StaticResource PhoneTextTitle3Style}" />
    <TextBlock Text="{Binding EndTime, StringFormat='{}{0:dd/MM/yyyy}'}" Style="{StaticResource PhoneTextTitle3Style}" />
   </StackPanel>
   <TextBlock Text="{Binding Location, StringFormat='Local: {0:a}'}" Style="{StaticResource PhoneTextTitle3Style}" />
  </StackPanel>
 </DataTemplate>
</phone:PhoneApplicationPage.Resources>

<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot">
 <Grid.Background>
  <ImageBrush ImageSource="Assets/Background/ImgFundo.png" />
 </Grid.Background>
<Grid.RowDefinitions>
 <RowDefinition Height="Auto"/>
 <RowDefinition Height="*"/>
</Grid.RowDefinitions>

<!--TitlePanel contains the name of the application and page title-->
<StackPanel Grid.Row="0" Margin="12,17,0,28">
 <TextBlock Text="INFOESTE 2015" Style="{StaticResource PhoneTextNormalStyle}"/>
 <TextBlock Text="minha agenda" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>

<!--ContentPanel - place additional content here-->
 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
 <!-- DEFINIÇÃO DO LISTBOX PARA EXIBIÇÃO DOS DADOS. REPARE O USO DO DATATEMPLATE ATRAVÉS DO ITEMTEMPLATE -->
 <ListBox Name="lblAgenda" Height="600" ItemTemplate="{StaticResource AtividadesItemTemplate}" VerticalAlignment="Top" />
 </Grid>
</Grid>

</phone:PhoneApplicationPage>

exemplo-agenda

Na sequencia temos a codificação necessária para acesso aos dados da agenda do Windows Phone.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using Microsoft.Phone.UserData;

namespace Infoeste2015
{
 public partial class Calendario : PhoneApplicationPage
 {
  public Calendario()
  {
   InitializeComponent();

   //DECLARAÇÃO DE UM OBJETO DA CLASSE APPOINTMENTS PARA RECUPERAÇÃO DOS DADOS DA AGENDA
   Appointments compromissos = new Appointments();
   compromissos.SearchCompleted += compromissos_SearchCompleted;

   //DEFINIÇÃO DA DATA DE INÍCIO E FIM DO PERÍODO DE CONSULTA E TAMBÉM A QUANTIDADE MÁXIMA DE COMPROMISSOS A SEREM RECUPERADOS
   DateTime inicio = new DateTime(2015, 5, 18);
   DateTime final = inicio.AddDays(7);
   int max = 30;

   compromissos.SearchAsync(inicio, final, max, "");
  }

  //ESSE MÉTODOS SERÁ INVOCADO APÓS A FINALIZAÇÃO DA PESQUISA PARA ENTÃO EXIBIRMOS OS DADOS NO LISTBOX
  void compromissos_SearchCompleted(object sender, AppointmentsSearchEventArgs e)
  {
   //OS DADOS CHEGAR ATRAVÉS DO ARGUMENTOS "e" DESTE MÉTODO. REPARE QUE NESSE EXEMPLO ESTAMOS BUSCANDO POR COMPROMISSOS CUJA PALAVRA CHAVE SEJA "INFOESTE".
   lblAgenda.ItemsSource = e.Results.Where(x => x.Subject.Contains("INFOESTE"));
  }
 }
}

Como resultado final podemos verificar a exibição dos compromissos registrados dentro de um determinado período e que contenham a palavra chave “INFOESTE”.

 

Abraços,

Eduardo Henrique Rizo

MCP

Posts Relacionados: 

Marcado com: , , , , , , , , , , ,
Publicado em Windows Phone
Sorocaba e Região
Prestadora de serviços RIZZO GS - Sorocaba/SP

Serviços de limpeza, conservação, recepção, copa, portaria, vigia, zeladoria, jardim, elétrica, hidráulica, pintura, etc.

Contato: (15) 3357-4263 / (15) 3357-4502 - contato@rizzogs.com.br

Website: http://www.rizzogs.com.br