Olá pessoal, tudo bom?
Segue um exemplo sobre como obter informações da sua lista de contatos armazenada no Windows Phone.
A primeira coisa a fazer é implementar uma classe para representar quais informações sobre os contatos você deseja obter, exibir e/ou manipular. No caso, criei uma classe chamada Contato.cs com a seguinte estrutura:
using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using Microsoft.Phone.UserData; namespace Exemplo { public class Contato { public object Foto { get; set; } public string Nome { get; set; } public string Telefone { get; set; } public string TelefoneCorrigido { get; set; } } }
Em seguida, prepare a interface da APP, que para o exemplo, imaginei um listbox exibindo a foto, o nome da pessoa e o número do telefone celular dos contatos registrados atualmente no Windows Phone. Veja o exemplo:
... <!--LayoutRoot is the root grid where all page content is placed--> <Grid x:Name="LayoutRoot"> <Grid.Background> <ImageBrush ImageSource="Imagens/background-page.jpg" Stretch="UniformToFill" /> </Grid.Background> <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="EXEMPLO" Style="{StaticResource PhoneTextNormalStyle}" Foreground="Yellow" FontWeight="Bold" /> <TextBlock x:Name="PageTitle" Text="contatos" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}" Foreground="Cyan" /> </StackPanel> <!--ContentPanel - place additional content here--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <TextBlock Name="txbAguarde" Text="Carregando a lista de contatos..." Foreground="White" HorizontalAlignment="Center" /> <toolkit:PerformanceProgressBar Name="ppbAguarde" VerticalAlignment="Top" Margin="0,35,0,0" IsIndeterminate="true" /> <ListBox Name="lstContatos"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Vertical"> <StackPanel Orientation="Horizontal"> <Image Width="45" VerticalAlignment="Center" Name="imgFoto" Source="{Binding Foto}" /> <TextBlock Name="txtNome" Height="Auto" FontSize="28" Foreground="White" VerticalAlignment="Center" Margin="4,0,0,0" Text="{Binding Nome}" /> </StackPanel> <TextBlock Name="txtTelefone" Height="Auto" Margin="48,0,0,0" HorizontalAlignment="Left" FontSize="22" Foreground="DarkOrange" FontWeight="Bold" Width="Auto" Text="{Binding Telefone}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> </Grid> ...
E para concluir, vamos verificar qual a implementação necessária na classe em C# para que os dados possam ser bindados no listbox demonstrado acima.
... using Microsoft.Phone.Controls; using Microsoft.Phone.Tasks; using Microsoft.Phone.UserData; using System.Text.RegularExpressions; using System.Windows.Media.Imaging; using System.IO; using System.Windows.Resources; namespace Exemplo { public partial class MainPage : PhoneApplicationPage { // Constructor public MainPage() { InitializeComponent(); ListarContatos(); } public void ListarContatos() { Contacts c = new Contacts(); c.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(c_SearchCompleted); c.SearchAsync(string.Empty, FilterKind.None, null); } void c_SearchCompleted(object sender, ContactsSearchEventArgs e) { //Trazendo apenas os contatos com números de telefone celular que contenham 8 números ou mais. var dados = from c in e.Results where c.PhoneNumbers.Count() > 0 && c.PhoneNumbers.Where(x => x.Kind == PhoneNumberKind.Mobile).FirstOrDefault() != null && c.PhoneNumbers.Where(x => x.Kind == PhoneNumberKind.Mobile).FirstOrDefault().PhoneNumber.Length >= 8 select new Contato { Foto = ObterFoto(c.GetPicture()), Nome = c.DisplayName, Telefone = c.PhoneNumbers.Where(x=>x.Kind == PhoneNumberKind.Mobile).FirstOrDefault().PhoneNumber, }; lstContatos.ItemsSource = dados; txbAguarde.Visibility = System.Windows.Visibility.Collapsed; ppbAguarde.IsIndeterminate = false; } public object ObterFoto(Stream img) { if (img != null) return Microsoft.Phone.PictureDecoder.DecodeJpeg(img); else { //Obtendo uma imagem padrão quando o contato não tem foto. Uri uri = new Uri("Imagens/rosto.jpg", UriKind.Relative); StreamResourceInfo sri = Application.GetResourceStream(uri); return Microsoft.Phone.PictureDecoder.DecodeJpeg(sri.Stream); } } } } ...
Espero que tenham gostado.
Grande abraço,
Eduardo Henrique Rizo
[twitter-follow screen_name=’eduardorizo’ show_count=’yes’]
Pingback: Free: Curso Windows Phone – Vários tópicos | Blog do Eduardo H. Rizo
Pingback: Curso Windows Phone: Exemplo de binding usando Listbox | Blog do Eduardo H. Rizo
Olá Eduardo,
O que significa no código “>” e “&&”? Qual a função deles? Estou naquele grupo de desenvolvedor do Facebook com você, mas achei que aqui você veria mais rápido.
Olá, tudo bom?
Na verdade significa apenas uma bagunça quando publiquei o post. 🙂
Agora o código está corrigido.
Obrigado,
Eduardo H. Rizo