Com certeza, em um dos seus projetos, você terá a necessidade de obter o endereço de um contato do seu usuário no Windows Phone, e esse Task é utilizado justamente para isso. O Address Chooser Task inicia o aplicativo de Contatos, permitindo assim ao usuário escolher um contato de sua lista. Assim que o usuário concluir a tarefa, é gerado um evento e o manipulador de eventos recebe um endereço no resultado.

No exemplo deste artigo será criada uma aplicação em que o usuário irá selecionar o contato e os dados deste contato serão exibidos em seguida na mesma página em um formulário.

Abra o Visual Studio e crie um projeto Windows Phone Application chamado ProjetoAddressChooser conforme a Figura 1.

Criação do Projeto ProjetoAddressChooser no Visual Studio
Figura 1. Criação do Projeto ProjetoAddressChooser no Visual Studio

Ao criar o projeto, é exibida uma caixa com a opção de escolha da versão do Windows Phone, escolha a 7.1, pois assim o seu aplicativo funcionará em todas as versões de Windows Phone disponíveis.

Abra o arquivo MainPage.xaml e vá ao content panel para adicionar um stackpanel que conterá o Botão que irá exibir ao usuário a seleção de contato e um formulário que iniciará no Visibility Collapsed, a MainPage.xaml deverá ficar conforme mostra a Listagem 1.

<phone:PhoneApplicationPage 
    x:Class="ProjetoAddressChooser.MainPage"
    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"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

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

        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" 
            Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="contatos" 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">
            <StackPanel Width="450" Height="500" VerticalAlignment="Top">
                <StackPanel Width="450" Height="80" VerticalAlignment="Top">
                    <Button Name="btnExibirContatos" Width="400" Height="80" 
                    Content="Exibir Contatos"  Click="btnExibirContatos_Click_1"/>
                </StackPanel>
                <Border Name="brdFormulario" BorderBrush="White" 
                BorderThickness="2" Width="450" Height="400" 
                Visibility="Collapsed">
                    <StackPanel Width="450" Height="400">
                        <TextBlock Foreground="White" Text="Formulário" 
                         FontWeight="Bold" FontSize="25" Margin="10"/>
                        <TextBlock Name="lblNome" Foreground="White" 
                         Text="Nome : " FontSize="25" Margin="10"/>
                        <TextBlock Name="lblEndereco" Foreground="White" 
                         Text="Endereço : " FontSize="25" Margin="10"/>
                    </StackPanel>
                </Border>
            </StackPanel>
        </Grid>
    </Grid>
 
</phone:PhoneApplicationPage>
Listagem 1. Criação do StackPanel que conterá o botão de seleção de contato e o formulário

Então, agora abra o arquivo MainPage.xaml.cs e adicione uma referência no topo da classe para o Microsoft.Phone.Tasks como mostra a Listagem 2.

using Microsoft.Phone.Tasks;
Listagem 2. Adicionando referência

Agora você deverá tratar e utilizar a classe no evento btnExibirContatos_Click_1 para exibir a lista de contatos, como mostra a listagem 3. No caso, é feita uma instância da classe AddressChooserTask e então a criação do método call-back após o término da escolha do contato e também o método Show para exibir a lista de contatos ao usuário; Você deverá também implementar o método addressChooser_Completed, para manipular e receber as informações do contato que o usuário escolheu, veja na Listagem 3.

Observação: O método de call-back é colocado antes do método Show do AddressChooserTask porque é uma chamada assíncrona, ou seja, ele já deve saber o que irá fazer ao completar a ação antes de iniciá-la.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Tasks;

namespace ProjetoAddressChooser
{
    public partial class MainPage : PhoneApplicationPage
    {        
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }

        private void btnExibirContatos_Click_1(object sender, RoutedEventArgs e)
        {
            AddressChooserTask addressChooser = new AddressChooserTask();
            addressChooser.Completed += addressChooser_Completed;
            addressChooser.Show();
        }

        void addressChooser_Completed(object sender, AddressResult e)
        {
            if (e.TaskResult == TaskResult.OK)
            {
                string endereco = e.Address;
                string nome = e.DisplayName;
                exibirFormulario(nome,endereco);
            }
            else
            {
                MessageBox.Show("Erro ao buscar contato.");
            }
        }

        private void exibirFormulario(string nome, string endereco)
        {
            lblNome.Text = nome;
            lblEndereco.Text = endereco;
            brdFormulario.Visibility = System.Windows.Visibility.Visible;
        }
    }
}
Listagem 3. Implementação dos métodos na classe MainPage.xaml.cs

Por ser uma plataforma bastante segura, o Windows Phone restringe e limita certos acessos ao desenvolvedor, como por exemplo, a navegação das páginas com a passagem dos dados do contato como parâmetro. Apesar da limitação, isso garante para os usuários uma maior confiança nas aplicações desenvolvidas para o Windows Phone e aprovadas no Windows Phone Store.

Para efetuar o teste desta aplicação no emulador, é necessário que você adicione uma conta de e-mail para conter os contatos disponíveis para seleção, conforme o exemplo. Então abra o emulador e vá em configuração, conforme a Figura 2.

Como acessar a configuração no emulador do Windows Phone
Figura 2. Como acessar a configuração no emulador do Windows Phone

E então agora selecione email+accounts nas opções de configuração e clique em add na account, como mostra a Figura 3.

Adicionando nova conta nas configurações
Figura 3. Adicionando nova conta nas configurações

Então, agora selecione uma conta de e-mail para vincular e insira os dados seguindo os passos indicados no dispositivo.

Após a configuração de pelo menos uma conta de e-mail, você poderá pressionar F5 e testar sua aplicação, como mostra a Figura 4.

Testando a aplicação
Figura 4. Testando a aplicação