방법: Windows Phone의 연락처 데이터 액세스

2012-02-09

연락처 데이터에 액세스하는 프로세스는 Contacts 개체에 대한 참조를 가져오고, 이 참조에서 비동기 검색을 수행한 다음, 그 결과를 Contact 개체의 컬렉션으로 캡처하는 것입니다. 그 결과를 다른 방식으로 사용할 수 있으며, 이 항목에서는 결과를 사용자 인터페이스에 바인딩하거나 결과를 통해 열거하는 방법에 대해 설명합니다.

참고참고:

Windows Phone SDK 7.1 에서는 사용자의 각기 다른 계정에서 취합된 사용자의 연락처 데이터에 대한 읽기 전용 액세스를 제공합니다. 자세한 내용은 Windows Phone의 연락처 및 일정을 참조하십시오.

이 항목은 다음 섹션으로 이루어져 있습니다.

이 프로시저에서는 테스트 용도로만 버튼 클릭 이벤트에 코드를 넣습니다. 응용프로그램 내에서 연락처 데이터가 필요한 어디에서든 연락처 데이터에 액세스할 수 있습니다. 다음 절차에서는 ButtonContacts이라는 버튼이 포함된 페이지가 있는 Windows Phone 응용프로그램을 사용한다고 가정합니다. 이 프로시저에서는 모든 연락처를 반환하는 필터 종류를 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 편집기를 열고 다음 코드를 추가합니다. Content Panel 또는 Layout Root 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 에뮬레이터의 샘플 연락처 중 두 개에 이 문자열이 포함되어 있습니다.

    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 편집기를 열고 다음 코드를 추가합니다. Content Panel 또는 Layout Root 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

표시: