Selezionare i contatti

Attraverso lo spazio dei nomi Windows.ApplicationModel.Contacts sono disponibili diverse opzioni per la selezione dei contatti. Qui viene mostrato come selezionare un singolo contatto o più contatti e come configurare il selezionatore di contatti per recuperare solo le informazioni che l'app richiede.

Configurare la selezione contatti

Creare un'istanza di Windows.ApplicationModel.Contacts.ContactPicker e assegnarla a una variabile.

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

Impostare la modalità di selezione (facoltativo)

Per impostazione predefinita, la selezione contatti recupera tutti i dati disponibili per i contatti selezionati dall'utente. La proprietà SelectionMode consente di configurare la selezione contatti per recuperare solo i campi dati necessari per l'app. È un modo più efficiente di usare la selezione contatti se è necessario solo un subset dei dati di contatto disponibili.

Prima di tutto, impostare la proprietà SelectionMode su Fields:

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

Utilizzare quindi la proprietà DesiredFieldsWithContactFieldType per specificare i campi che si desidera recuperare dalla selezione contatti. In questo esempio viene configurato il selettore contatti per recuperare indirizzi di posta elettronica:

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

Avviare la selezione

Contact contact = await contactPicker.PickContactAsync();

Usare PickContactsAsync se si desidera che l'utente selezioni uno o più contatti.

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

Elaborare i contatti

Quando la selezione viene restituita, verificare se l'utente ha selezionato contatti. In tal caso, elaborare le informazioni di contatto.

In questo esempio viene illustrato come elaborare un singolo contatto. Qui si recupera il nome del contatto e lo si copia in un controllo TextBlock chiamato OutputName.

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

In questo esempio viene illustrato come elaborare più contatti.

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

Esempio completo (singolo contatto)

In questo esempio viene usato il selettore contatti per recuperare il nome di un singolo contatto insieme a un indirizzo di posta elettronica, una posizione o un numero di telefono.

// ...
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;
    }
}

Esempio completo (più contatti)

In questo esempio viene utilizzato il selettore contatti per recuperare più contatti e quindi aggiungere i contatti a un controllo ListView denominato 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;
        }
    }
}

Riepilogo e passaggi successivi

Ora si dispone una conoscenza di base di come usare la selezione contatti per recuperare le informazioni di contatto. Scaricare gli esempi di app di Windows universale da GitHub per visualizzare altri esempi di come usare i contatti e la selezione contatti.