方法: Windows Phone の連絡先データにアクセスする

2012/02/09

連絡先データにアクセスするには、Contacts オブジェクトの参照を取得し、そのオブジェクトに対して非同期検索を実行してから、Contact オブジェクトのコレクションとして結果をキャプチャします。結果はさまざまに使用できます。このトピックでは、結果をユーザー インターフェイスにバインドしたり、結果を列挙したりする方法を示します。

注注:

Windows Phone SDK 7.1 では、ユーザーの複数のアカウント全体で集約されたユーザーの連絡先データに読み取り専用でアクセスできます。詳細については、「Windows Phone の連絡先とカレンダー」を参照してください。

このトピックは、次のセクションで構成されています。

この手順では、テストの目的でのみボタン クリック イベントにコードを配置します。作成したアプリケーションでは、必要に応じて連絡先データにアクセスできます。以下の手順では、Windows Phone アプリケーションに ButtonContacts という名前のボタンを含むページが存在していることを前提としています。この手順では、フィルターの種類を None に設定します。これは、すべての連絡先を返します。詳細については、「Windows Phone の連絡先のフィルターと適合」を参照してください。

注注:

Windows Phone エミュレーターには、連絡先のサンプルが含まれています。これらの手順は、Windows Phone エミュレーターまたは物理デバイスを使用してテストできます。

連絡先データにアクセスするには

  1. ページの分離コード ファイルの先頭に、次のステートメントを追加します。

    using Microsoft.Phone.UserData;
    
  2. 次のコードを追加します。ボタン クリック イベントと、非同期検索の完了したイベントを処理するためのメソッドが含まれています。

    private void ButtonContacts_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);
    
        //Start the asynchronous search.
        cons.SearchAsync(String.Empty, FilterKind.None, "Contacts Test #1");
    }
    
    void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
    {
        //Do something with the results.
        MessageBox.Show(e.Results.Count().ToString());
    }
    

この手順では、連絡先検索の結果のデータを、ユーザー インターフェイスに直接バインドします。この手順は、前のセクションで "連絡先データへのアクセス" の手順を完了していることを前提としています。

連絡先データをバインドするには

  1. ページの XAML エディターを開き、次のコードを追加します。コードをコンテンツ パネルまたはレイアウト ルート GRID 要素に追加できます。この XAML は、連絡先データにバインドするリスト ボックスを作成します。リスト ボックスの各行のデータ テンプレートには、連絡先の名前が含まれます。作成したアプリケーションでは、必要に応じてデータ テンプレートを作成できます。詳細については、「データ バインディングの概要」および「データ テンプレートの概要 」を参照してください。

    <StackPanel Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
    
        <TextBlock Name="ContactResultsLabel" Text="results are loading..." Style="{StaticResource PhoneTextLargeStyle}" TextWrapping="Wrap" />
    
        <ListBox Name="ContactResultsData" ItemsSource="{Binding}" Height="200" Margin="24,0,0,0" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Name="ContactResults" Text="{Binding Path=DisplayName, Mode=OneWay}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
    
  2. ページの分離コードで、既存のイベント ハンドラーを次のコードに置き換えます。このコードは、検索の結果に等しいリスト ボックスのデータ コンテキストを設定することで、連絡先データをユーザー インターフェイスにバインドします。結果がない場合のエラー処理を含みます。さらに、コードは結果があるかどうかによって、リスト ボックス ラベルのテキストも変更します。

    void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
    {
        try
        {
            //Bind the results to the user interface.
            ContactResultsData.DataContext = e.Results;
        }
        catch (System.Exception)
        {
            //No results
        }
    
        if (ContactResultsData.Items.Any())
        {
            ContactResultsLabel.Text = "results";
        }
        else
        {
            ContactResultsLabel.Text = "no results";
        }
    }
    
  3. ソリューションを保存してビルドします。

  4. アプリケーションを起動し、ボタンをクリックします。

    データがリスト ボックスに表示されます。

この手順では、連絡先検索の結果を列挙し、結果をメッセージ ボックスに表示します。この手順は、このトピック内の前のセクションで "連絡先データへのアクセス" の手順を完了していることを前提としています。

連絡先データを列挙するには

  1. ページの分離コードで、既存のイベント ハンドラーを次のコードに置き換えます。このコードでは、for-each ループを使用して連絡先データを列挙します。

    void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
    
        foreach (Contact con in e.Results)
        {
            sb.AppendLine(con.DisplayName);
        }
    
        MessageBox.Show(sb.ToString());
    }
    
  2. ソリューションを保存してビルドします。

  3. アプリケーションを起動し、ボタンをクリックします。

    メッセージ ボックスが表示されます。

この手順では、LINQ を使用して連絡先検索の結果を調整します。結果をユーザー インターフェイスに直接データバインドします。この手順は、このトピック内の前のセクションで "連絡先データへのアクセス" の手順を完了していることを前提としています。

注意点注意:

連絡先データのサイズは大きく異なる可能性があります。既にインデックスが付いている組み込み検索を使用する場合より、LINQ の方が時間がかかります。可能な場合には、組み込み検索フィルターを使用する必要があります。詳細については、「Windows Phone の連絡先のフィルターと適合」を参照してください。

LINQ を使用するには

  1. ページの分離コードで、既存のイベント ハンドラーを次のコードに置き換えます。このコードでは、結果から、電子メール アドレスに "example" が含まれる連絡先をクエリします。Windows Phone エミュレーターのサンプル連絡先の 2 つに、この文字列が含まれます。

    void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
    {
        try
        {
            ContactResultsDataLINQ.DataContext =
                from Contact con in e.Results
                from ContactEmailAddress a in con.EmailAddresses
                where a.EmailAddress.Contains("example")
                select con;
        }
        catch (System.Exception)
        {
            //No results
        }
    }
    
  2. ページの XAML エディターを開き、次のコードを追加します。コードをコンテンツ パネルまたはレイアウト ルート GRID 要素に追加できます。この XAML は、連絡先データにバインドするリスト ボックスを作成します。リスト ボックスの各行に、連絡先の電子メール アドレスが含まれます。各連絡先は複数の電子メール アドレスを持つ場合があり、この XAML では最初の電子メール アドレスが表示されます。

    <ListBox Name="ContactResultsDataLINQ" ItemsSource="{Binding}" Height="200" Margin="24,0,0,0" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Path=EmailAddresses[0].EmailAddress, Mode=OneWay}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    
  3. ソリューションを保存してビルドします。

  4. アプリケーションを起動し、ボタンをクリックします。

    フィルター処理されたデータがリスト ボックスに表示されます。Windows Phone エミュレーターでテストしている場合は、次のように表示されます。

    Chris@example.com

    Julia@example.com

表示: