导出 (0) 打印
全部展开

如何显示 Windows Phone 联系人的照片

2012/2/9

显示联系人照片的过程就是获取 Contact 对象的引用,创建新位图图像,将其源设置为 GetPicture,然后在用户界面中显示该位图。还可以创建自定义数据转换器并将照片数据绑定到用户界面。有关访问联系人数据的更多信息,请参阅如何访问 Windows Phone 的联系人数据

注意注意:

Windows Phone SDK 7.1 为您提供对用户的联系人数据(跨用户的不同帐户聚合在一起)的只读访问。大多数帐户都提供对照片的访问。有关更多信息,请参阅 Windows Phone 的联系人和日历

本主题包含以下各节:

联系人姓名和照片

在此过程中,您将代码放在仅用于测试的按钮单击事件中。在您自己的应用程序中,只要需要,您就可以访问联系人照片。以下过程假定您拥有一个 Windows Phone 应用程序,该应用程序包含一个可以向其中添加控件的页面。

重要说明重要说明:

Windows Phone 模拟器包含示例联系人;但是,这些联系人没有照片。您应该使用物理设备测试此过程。

显示联系人照片的步骤

  1. 为您的页面打开 XAML 编辑器并添加以下代码。可以将代码添加到 Content Panel 或 Layout Root GRID 元素。该代码创建一个空白的图像控件,用于包含照片和按钮。还在照片周围放置一个主题感知边框。

    <StackPanel Orientation="Horizontal">
        <Border BorderThickness="2" HorizontalAlignment="Left" BorderBrush="{StaticResource PhoneAccentBrush}" >
    
            <Image Name="Picture" Height="85" Width="85" HorizontalAlignment="Left" />
        </Border>
        <Button Content="Get One Picture" Width="Auto" Click="ButtonOnePicture_Click" />
    </StackPanel>
    
  2. 打开您页面的代码隐藏文件。在顶部,添加以下语句。

    using Microsoft.Phone.UserData;
    using System.Windows.Media.Imaging;
    
  3. 向页面的类中添加以下代码。该代码包含按钮单击事件,并启动异步联系人搜索。

    private void ButtonOnePicture_Click(object sender, RoutedEventArgs e)
    {
        Contacts cons = new Contacts();
    
        //Identify the method that runs after the asynchronous search completes.
        cons.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(Contacts_SearchCompleted_One);
    
        //Start the asynchronous search.
        cons.SearchAsync(String.Empty, FilterKind.None, "Contacts Test #2 Picture");
    
        //cons.SearchAsync(String.Empty, FilterKind.PinnedToStart, "Contacts Test #2 Picture");
    }
    
  4. 向页面的类中添加以下代码。该代码包含处理异步搜索的已完成事件的方法。在该代码中,您获取搜索返回的第一个联系人,创建新位图图像,将其源设置为 GetPicture,并将该照片显示到第一步中所添加的图像控件中。

    void Contacts_SearchCompleted_One(object sender, ContactsSearchEventArgs e)
    {
        try
        {
            //We are using the first contact only.
            Contact con = e.Results.First();
    
            BitmapImage img = new BitmapImage();
            img.SetSource(con.GetPicture());
            Picture.Source = img;
        }
        catch (Exception)
        {
            //We can't get a picture of the contact.
        }
    }
    
  5. 保存并生成您的解决方案。

  6. 启动您的应用程序并单击该按钮。

    此时应该显示第一个联系人的照片。如果没有显示照片,则可能是因为第一个联系人没有照片。尝试更改联系人搜索以返回固定到“开始”屏幕的联系人,而不是返回所有联系人。为此,在第三步的代码中,取消注释最后一行并注释掉第二行到最后一行。有关更多信息,请参阅 Windows Phone 的联系人筛选和匹配

由于联系人照片不是属性,但可以通过调用 GetPicture 方法检索,因此您需要一个自定义数据转换器来绑定它们。在此过程中,您将代码放在仅用于测试的按钮单击事件中。在您自己的应用程序中,只要需要,您就可以访问联系人照片。以下过程假定您拥有一个 Windows Phone 应用程序,该应用程序包含一个可以向其中添加控件的页面。

重要说明重要说明:

Windows Phone 模拟器包含示例联系人;但是,这些联系人没有照片。您应该使用物理设备测试此过程。

将照片数据绑定到用户界面的步骤

  1. 打开您页面的代码隐藏文件。在顶部,添加以下语句。

    using Microsoft.Phone.UserData;
    using System.Windows.Media.Imaging;
    
  2. 向页面的类中添加以下代码。该代码包含按钮单击事件,并启动异步联系人搜索。

    private void ButtonManyPictures_Click(object sender, RoutedEventArgs e)
    {
        Contacts cons = new Contacts();
    
        //Identify the method that runs after the asynchronous search completes.
        cons.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(Contacts_SearchCompleted_Many);
    
        //Start the asynchronous search.
        cons.SearchAsync(String.Empty, FilterKind.None, "Contacts Test #3 Picture");
    }
    
  3. 向页面的类中添加以下代码。该代码包含处理异步搜索的已完成事件的方法。在该代码中,您通过将第一步中列表框的数据上下文设置为等于搜索结果来绑定联系人数据(包括照片)。

    void Contacts_SearchCompleted_Many(object sender, ContactsSearchEventArgs e)
    {
        try
        {
            //Bind the results to the list box that displays them in the UI.
            ContactResultsData.DataContext = e.Results;
        }
        catch (System.Exception)
        {
            //No results
        }
    }
    
  4. 添加以下代码。该代码应该放在命名空间中,但位于 Page 类后面。这是自定义数据转换器,它允许您将照片绑定到用户界面。

    public class ContactPictureConverter : System.Windows.Data.IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Contact c = value as Contact;
            if (c == null) return null;
    
            System.IO.Stream imageStream = c.GetPicture();
            if (null != imageStream)
            {
                return Microsoft.Phone.PictureDecoder.DecodeJpeg(imageStream);
            }
            return null;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    
  5. 为您的页面打开 XAML 编辑器。在 <phone:PhoneApplicationPage> 标记中,借助其他命名空间声明,添加以下代码。将占位符 YOURSOLUTIONNAME 替换为您的解决方案的名称(不带文件扩展名)。该代码允许您访问自定义数据转换器。

    xmlns:MyApp="clr-namespace:YOURSOLUTIONNAME"
    
  6. PHONE:PHONEAPPLICATIONPAGE 元素之后、GRID 元素之前,添加以下代码。该代码允许您在数据绑定中使用自定义数据转换器。

    <phone:PhoneApplicationPage.Resources>
        <MyApp:ContactPictureConverter x:Key="ContactPictureConverter" />
    </phone:PhoneApplicationPage.Resources>
    
  7. 添加以下代码。可以将代码添加到 Content Panel 或 Layout Root GRID 元素。

    <StackPanel Orientation="Vertical">
                        
        <Button Content="Get Many Pictures" Width="Auto" Click="ButtonManyPictures_Click" />
    
        <ListBox Grid.Row="1" Name="ContactResultsData" ItemsSource="{Binding}" Height="300" Margin="24,24,0,0" VerticalAlignment="Top">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Border BorderThickness="2" HorizontalAlignment="Left" BorderBrush="{StaticResource PhoneAccentBrush}" >
                            <Image Source="{Binding Converter={StaticResource ContactPictureConverter}}" Width="48" Height="48" Stretch="Fill" />
                        </Border>
                        <TextBlock Name="ContactResults" Text="{Binding Path=DisplayName, Mode=OneWay}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
    

    此 XAML 创建一个按钮和一个您绑定到联系人数据的列表框。该列表框中每一行的数据模板都包含联系人的照片和姓名。有关更多信息,请参阅数据绑定概述数据模板概述

  8. 保存并生成您的解决方案。

  9. 启动您的应用程序并单击该按钮。

    联系人填充列表框。滚动该列表,直到您看到具有照片的联系人。

显示:
© 2015 Microsoft