Condividi tramite


Selezionare i contatti

Tramite lo spazio dei nomi Windows.ApplicationModel.Contacts, sono disponibili diverse opzioni per la selezione dei contatti. Qui verrà illustrato come selezionare un singolo contatto o più contatti e verrà illustrato come configurare la selezione contatti per recuperare solo le informazioni di contatto necessarie per l'app.

Impostare il selettore di 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 il selettore contatti per richiedere solo i campi dati necessari per l'app. Si tratta di un modo più efficiente per usare la selezione contatti se è necessario solo un subset dei dati di contatto disponibili.

Per prima cosa, 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 il selettore contatti recuperi. In questo esempio viene configurato il selettore contatti per recuperare gli indirizzi di posta elettronica:

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

Avvia il selettore

Contact contact = await contactPicker.PickContactAsync();

Usa PickContactsAsync se vuoi che l'utente selezioni uno o più contatti.

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

Elaborare i contatti

Quando il selettore ritorna, verificare se l'utente ha selezionato dei contatti. In tal caso, gestire le informazioni di contatto.

In questo esempio viene illustrato come elaborare un singolo contatto. Qui recuperiamo il nome del contatto e lo copiamo in un controllo TextBlock denominato 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, alla posizione o al 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 poi aggiungerli 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 ha una conoscenza di base di come usare la selezione contatti per recuperare le informazioni di contatto. Scaricare gli esempi di app di Windows universali da GitHub per visualizzare altri esempi per usare i contatti e il selettore di contatti.