Поделиться через


Выбор контактов

В пространстве имен Windows.ApplicationModel.Contacts есть несколько вариантов выбора контактов. Здесь мы покажем, как выбрать один контакт или несколько контактов, и мы покажем, как настроить средство выбора контактов для получения только контактных данных, необходимых вашему приложению.

Настройка средства выбора контактов

Создайте экземпляр Windows.ApplicationModel.Contacts.ContactPicker и назначьте его переменной.

var contactPicker = new Windows.ApplicationModel.Contacts.ContactPicker();

Настройка режима выбора (необязательно)

По умолчанию средство выбора контактов извлекает все доступные данные для выбранных пользователем контактов. Свойство SelectionMode позволяет настроить средство выбора контактов, чтобы получить только поля данных, необходимые приложению. Это более эффективный способ использовать средство выбора контактов, если вам требуется только подмножество доступных контактных данных.

Сначала задайте для свойства SelectionMode значение Fields:

contactPicker.SelectionMode = Windows.ApplicationModel.Contacts.ContactSelectionMode.Fields;

Затем используйте свойство DesiredFieldsWithContactFieldType , чтобы указать поля, которые требуется получить средство выбора контактов. В этом примере средство выбора контактов настраивает получение адресов электронной почты:

contactPicker.DesiredFieldsWithContactFieldType.Add(Windows.ApplicationModel.Contacts.ContactFieldType.Email);

Запуск средства выбора

Contact contact = await contactPicker.PickContactAsync();

Используйте PickContactsAsync , если вы хотите, чтобы пользователь выбрал один или несколько контактов.

public IList<Contact> contacts;
contacts = await contactPicker.PickContactsAsync();

Обработка контактов

Когда средство выбора возвращается, проверьте, выбран ли пользователь какие-либо контакты. В этом случае обработайте контактные данные.

В этом примере показано, как обрабатывать один контакт. Здесь мы извлекаем имя контакта и скопируйм его в элемент управления TextBlock с именем OutputName.

if (contact != null)
{
    OutputName.Text = contact.DisplayName;
}
else
{
    rootPage.NotifyUser("No contact was selected.", NotifyType.ErrorMessage);
}

В этом примере показано, как обрабатывать несколько контактов.

if (contacts != null && contacts.Count > 0)
{
    foreach (Contact contact in contacts)
    {
        // Do something with the contact information.
    }
}

Полный пример (один контакт)

В этом примере средство выбора контактов используется для получения имени одного контакта вместе с адресом электронной почты, расположением или номером телефона.

// ...
using Windows.ApplicationModel.Contacts;
// ...

private async void PickAContactButton-Click(object sender, RoutedEventArgs e)
{
    ContactPicker contactPicker = new ContactPicker();

    contactPicker.DesiredFieldsWithContactFieldType.Add(ContactFieldType.Email);
    contactPicker.DesiredFieldsWithContactFieldType.Add(ContactFieldType.Address);
    contactPicker.DesiredFieldsWithContactFieldType.Add(ContactFieldType.PhoneNumber);

    Contact contact = await contactPicker.PickContactAsync();

    if (contact != null)
    {
        OutputFields.Visibility = Visibility.Visible;
        OutputEmpty.Visibility = Visibility.Collapsed;

        OutputName.Text = contact.DisplayName;

        AppendContactFieldValues(OutputEmails, contact.Emails);
        AppendContactFieldValues(OutputPhoneNumbers, contact.Phones);
        AppendContactFieldValues(OutputAddresses, contact.Addresses);
    }
    else
    {
        OutputEmpty.Visibility = Visibility.Visible;
        OutputFields.Visibility = Visibility.Collapsed;
    }
}

private void AppendContactFieldValues<T>(TextBlock content, IList<T> fields)
{
    if (fields.Count > 0)
    {
        StringBuilder output = new StringBuilder();

        if (fields[0].GetType() == typeof(ContactEmail))
        {
            foreach (ContactEmail email in fields as IList<ContactEmail>)
            {
                output.AppendFormat("Email: {0} ({1})\n", email.Address, email.Kind);
            }
        }
        else if (fields[0].GetType() == typeof(ContactPhone))
        {
            foreach (ContactPhone phone in fields as IList<ContactPhone>)
            {
                output.AppendFormat("Phone: {0} ({1})\n", phone.Number, phone.Kind);
            }
        }
        else if (fields[0].GetType() == typeof(ContactAddress))
        {
            List<String> addressParts = null;
            string unstructuredAddress = "";

            foreach (ContactAddress address in fields as IList<ContactAddress>)
            {
                addressParts = (new List<string> { address.StreetAddress, address.Locality, address.Region, address.PostalCode });
                unstructuredAddress = string.Join(", ", addressParts.FindAll(s => !string.IsNullOrEmpty(s)));
                output.AppendFormat("Address: {0} ({1})\n", unstructuredAddress, address.Kind);
            }
        }

        content.Visibility = Visibility.Visible;
        content.Text = output.ToString();
    }
    else
    {
        content.Visibility = Visibility.Collapsed;
    }
}

Полный пример (несколько контактов)

В этом примере средство выбора контактов используется для извлечения нескольких контактов, а затем добавляет контакты в элемент управления ListView.OutputContacts

MainPage rootPage = MainPage.Current;
public IList<Contact> contacts;

private async void PickContactsButton-Click(object sender, RoutedEventArgs e)
{
    var contactPicker = new Windows.ApplicationModel.Contacts.ContactPicker();
    contactPicker.CommitButtonText = "Select";
    contacts = await contactPicker.PickContactsAsync();

    // Clear the ListView.
    OutputContacts.Items.Clear();

    if (contacts != null && contacts.Count > 0)
    {
        OutputContacts.Visibility = Windows.UI.Xaml.Visibility.Visible;
        OutputEmpty.Visibility = Visibility.Collapsed;

        foreach (Contact contact in contacts)
        {
            // Add the contacts to the ListView.
            OutputContacts.Items.Add(new ContactItemAdapter(contact));
        }
    }
    else
    {
        OutputEmpty.Visibility = Visibility.Visible;
    }         
}
public class ContactItemAdapter
{
    public string Name { get; private set; }
    public string SecondaryText { get; private set; }

    public ContactItemAdapter(Contact contact)
    {
        Name = contact.DisplayName;
        if (contact.Emails.Count > 0)
        {
            SecondaryText = contact.Emails[0].Address;
        }
        else if (contact.Phones.Count > 0)
        {
            SecondaryText = contact.Phones[0].Number;
        }
        else if (contact.Addresses.Count > 0)
        {
            List<string> addressParts = (new List<string> { contact.Addresses[0].StreetAddress,
              contact.Addresses[0].Locality, contact.Addresses[0].Region, contact.Addresses[0].PostalCode });
              string unstructuredAddress = string.Join(", ", addressParts.FindAll(s => !string.IsNullOrEmpty(s)));
            SecondaryText = unstructuredAddress;
        }
    }
}

Сводка и дальнейшие действия

Теперь у вас есть базовое представление о том, как использовать средство выбора контактов для получения контактных данных. Скачайте примеры универсальных приложений Windows из GitHub, чтобы просмотреть дополнительные примеры использования контактов и средства выбора контактов.