選取器: 連絡人選取視窗, 自訂連絡人選取視窗
介紹
重新想象 Windows 8 Store Apps 之 選取器
ContactPicker - 連絡人選取器
ContactPickerUI - 自訂連絡人選取器
樣本
示範如何通過 ContactPicker 選擇一個或多個連絡人 ,以及如何開發自訂連絡人選取器
1、 開發一個自訂連絡人選取器
Picker/MyContactPicker.xaml
<Page x:Class="XamlDemo.Picker.MyContactPicker" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:XamlDemo.Picker" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Transparent"> <StackPanel Margin="120 0 0 0"> <TextBlock Name="lblMsg" FontSize="14.667" /> <Button Name="btnAddContract" Content="增加一個連絡人" Click="btnAddContract_Click" Margin="0 10 0 0" /> </StackPanel> </Grid></Page>
Picker/MyContactPicker.xaml.cs
/* * 示範如何開發自訂的連絡人選取器 * * 1、在 Package.appxmanifest 中新增一個“連絡人選取器”聲明,並做相關配置 * 2、在 App.xaml.cs 中 override void OnActivated(IActivatedEventArgs args),以擷取連絡人選取器的相關資訊 * * ContactPickerActivatedEventArgs - 通過“連絡人選取器”啟用應用程式時的事件參數 * ContactPickerUI - 擷取 ContactPickerUI 對象 * PreviousExecutionState, Kind, SplashScreen - 各種啟用 app 的方式的事件參數基本上都有這些屬性,就不多說了 * * ContactPickerUI - 自訂連絡人選取器的協助類 * SelectionMode - 擷取由 ContactPicker(調用者)設定的 SelectionMode 屬性 * DesiredFields - 擷取由 ContactPicker(調用者)設定的 DesiredFields 屬性 * AddContact(string id, Contact contact) - 選取一個連絡人 * id - 連絡人標識 * contact - 一個 Contact 對象 * RemoveContact() - 刪除指定標識的連絡人 * ContainsContact() - 指定標識的連絡人是否已被選取 * ContactRemoved - 移除一個已被選取的連絡人時所觸發的事件 * * Contact - 返回給調用者的連絡人對象 * Name - 名稱 * Thumbnail - 縮圖 * Fields - 連絡人的欄位資料,每一條資料都是一個實現了 IContactField 介面的對象 * * ContactField - 實現了 IContactField 介面,用於描述連絡人的某一個欄位資料 * Type - 欄位類型(ContactFieldType 枚舉) * Email, PhoneNumber, Location, InstantMessage, Custom * Category - 欄位類別(ContactFieldCategory 枚舉) * None, Home, Work, Mobile, Other * Value - 欄位的值 */ using System;using Windows.ApplicationModel.Activation;using Windows.ApplicationModel.Contacts.Provider;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;using Windows.UI.Xaml.Navigation;using Windows.ApplicationModel.Contacts;using Windows.Storage.Streams;using Windows.UI.Core; namespace XamlDemo.Picker{ public sealed partial class MyContactPicker : Page { private ContactPickerUI _contactPickerUI; public MyContactPicker() { this.InitializeComponent(); } protected override void OnNavigatedTo(NavigationEventArgs e) { // 擷取 ContactPickerUI 對象 var contactPickerActivated = e.Parameter as ContactPickerActivatedEventArgs; _contactPickerUI = contactPickerActivated.ContactPickerUI; _contactPickerUI.ContactRemoved += _contactPickerUI_ContactRemoved; } protected override void OnNavigatedFrom(NavigationEventArgs e) { _contactPickerUI.ContactRemoved -= _contactPickerUI_ContactRemoved; } // 從選取緩衝區移除後 async void _contactPickerUI_ContactRemoved(ContactPickerUI sender, ContactRemovedEventArgs args) { // 注意:無法直接得知 ContactPickerUI 是單選模式還是多選模式,需要判斷當添加了一個連絡人後,再添加一個連絡人,如果系統會自動移除前一個連絡人,則說明是單選模式 await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { lblMsg.Text += "removed contact: " + args.Id; lblMsg.Text += Environment.NewLine; }); } private void btnAddContract_Click(object sender, RoutedEventArgs e) { Random random = new Random(); // 構造一個 Contact 對象 Contact contact = new Contact(); contact.Name = "webabcd " + random.Next(1000, 10000).ToString(); contact.Fields.Add(new ContactField(random.Next(1000, 10000).ToString(), ContactFieldType.Email, ContactFieldCategory.Home)); contact.Fields.Add(new ContactField(random.Next(1000, 10000).ToString(), ContactFieldType.Email, ContactFieldCategory.Work)); contact.Fields.Add(new ContactField(random.Next(1000, 10000).ToString(), ContactFieldType.PhoneNumber, ContactFieldCategory.Home)); contact.Fields.Add(new ContactField(random.Next(1000, 10000).ToString(), ContactFieldType.PhoneNumber, ContactFieldCategory.Work)); contact.Thumbnail = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/Logo.png", UriKind.Absolute)); string id = Guid.NewGuid().ToString(); // 向選取緩衝區新增一個連絡人 switch (_contactPickerUI.AddContact(id, contact)) { case AddContactResult.Added: // 已被成功添加 lblMsg.Text += "added contact: " + id; lblMsg.Text += Environment.NewLine; break; case AddContactResult.AlreadyAdded: // 選取緩衝區已有此連絡人 lblMsg.Text += "already added contact: " + id; lblMsg.Text += Environment.NewLine; break; case AddContactResult.Unavailable: // 無效連絡人 lblMsg.Text += "unavailable contact: " + id; lblMsg.Text += Environment.NewLine; break; } } }}
2、判斷程式是否是由連絡人選取器啟用,在 App.xaml.cs 中 override void OnActivated (IActivatedEventArgs args)
App.xaml.cs
protected override void OnActivated(IActivatedEventArgs args){ // 通過連絡人選取器啟用應用程式時 if (args.Kind == ActivationKind.ContactPicker) { ContactPickerActivatedEventArgs contactPickerArgs = args as ContactPickerActivatedEventArgs; Frame rootFrame = new Frame(); rootFrame.Navigate(typeof(MainPage), contactPickerArgs); Window.Current.Content = rootFrame; Window.Current.Activate(); }}