Auswählen von Kontakten

Mit dem Windows.ApplicationModel.Contacts-Namespace verfügen Sie über mehrere Optionen zum Auswählen von Kontakten. Wir zeigen Ihnen hier, wie Sie einen einzelnen Kontakt oder mehrere Kontakte auswählen und wie Sie die Kontaktauswahl so konfigurieren, dass nur die von der App benötigten Kontaktinformationen abgerufen werden.

Einrichten der Kontaktauswahl

Erstellen Sie eine Instanz von Windows.ApplicationModel.Contacts.ContactPicker , und weisen Sie sie einer Variablen zu.

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

Festlegen des Auswahlmodus (optional)

Standardmäßig ruft die Kontaktauswahl alle verfügbaren Daten für die vom Benutzer ausgewählten Kontakte ab. Mit der SelectionMode-Eigenschaft können Sie die Kontaktauswahl so konfigurieren, dass nur die Datenfelder abgerufen werden, die Ihre App benötigt. Dies ist eine effizientere Möglichkeit, die Kontaktauswahl zu verwenden, wenn Sie nur eine Teilmenge der verfügbaren Kontaktdaten benötigen.

Legen Sie zunächst die SelectionMode-Eigenschaft auf Fields fest:

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

Verwenden Sie dann die DesiredFieldsWithContactFieldType-Eigenschaft , um die Felder anzugeben, die die Kontaktauswahl abrufen soll. In diesem Beispiel wird die Kontaktauswahl so konfiguriert, dass E-Mail-Adressen abgerufen werden:

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

Starten der Auswahl

Contact contact = await contactPicker.PickContactAsync();

Verwenden Sie PickContactsAsync , wenn der Benutzer einen oder mehrere Kontakte auswählen soll.

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

Verarbeiten der Kontakte

Wenn die Auswahl zurückgegeben wird, überprüfen Sie, ob der Benutzer Kontakte ausgewählt hat. Falls ja, verarbeiten Sie die Kontaktinformationen.

In diesem Beispiel wird gezeigt, wie ein einzelner Kontakt verarbeitet wird. Hier rufen wir den Namen des Kontakts ab und kopieren ihn in ein TextBlock-Steuerelement namens OutputName.

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

In diesem Beispiel wird gezeigt, wie mehrere Kontakte verarbeitet werden.

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

Vollständiges Beispiel (einzelner Kontakt)

In diesem Beispiel wird die Kontaktauswahl verwendet, um den Namen eines einzelnen Kontakts zusammen mit einer E-Mail-Adresse, einem Standort oder einer Telefonnummer abzurufen.

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

Vollständiges Beispiel (mehrere Kontakte)

In diesem Beispiel wird die Kontaktauswahl verwendet, um mehrere Kontakte abzurufen und dann die Kontakte zu einem ListView-Steuerelement hinzuzufügen, das aufgerufen wird 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;
        }
    }
}

Zusammenfassung und nächste Schritte

Jetzt haben Sie ein grundlegendes Verständnis für die Verwendung der Kontaktauswahl zum Abrufen von Kontaktinformationen. Laden Sie die Beispiele für universelle Windows-Apps von GitHub herunter, um weitere Beispiele für die Verwendung von Kontakten und der Kontaktauswahl anzuzeigen.