程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Windows 8 Store Apps學習(27) 選取器: 聯系人選取窗口

Windows 8 Store Apps學習(27) 選取器: 聯系人選取窗口

編輯:關於.NET

選取器: 聯系人選取窗口, 自定義聯系人選取窗口

介紹

重新想象 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();
    }
}

3、通過聯系人選取器選擇聯系人。注:如果需要激活自定義的聯系人選取器,請在彈出的選取器 窗口的左上角選擇對應 Provider

Picker/ContactPickerDemo.xaml

<Page
    x:Class="XamlDemo.Picker.ContactPickerDemo"
    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" />
    
            <Image Name="imgThumbnail" Width="100" Height="100" HorizontalAlignment="Left" Margin="0 10 0 0"  />
    
            <Button Name="btnPickContact" Content="pick a contact" Click="btnPickContact_Click" Margin="0 10 0 0" />
    
            <Button Name="btnPickContacts" Content="pick multiple contacts" Click="btnPickContacts_Click" Margin="0 10 0 0" />
    
        </StackPanel>
    </Grid>
</Page>

Picker/ContactPickerDemo.xaml.cs

/*
 * 演示如何通過 ContactPicker 選擇一個或多個聯系人
 * 
 * ContactPicker - 聯系人選擇窗口
 *     CommitButtonText - 聯系人選擇窗口的確定按鈕的顯示文本,此按鈕默認顯示的文本為“確定”
 *     SelectionMode - 選取模式(ContactSelectionMode 枚舉)
 *         Contacts - 請對我提供聯系人的全部字段的數據,默認值
 *         Fields - 請對我提供指定字段的數據
 *     DesiredFields - 當 SelectionMode.Fields 時,請對我提供指定字段的數據,字段名稱來自 KnownContactField 枚舉
 *     PickSingleContactAsync() - 選取一個聯系人,返回 ContactInformation 對象
 *     PickMultipleContactsAsync() - 選取多個聯系人,返回 ContactInformation 對象集合
 *     
 * ContactInformation - 聯系人信息對象
 *     Name, Emails, PhoneNumbers, Locations, InstantMessages, CustomFields
 *     GetThumbnailAsync() - 獲取聯系人縮略圖
 */
    
using System;
using System.Collections.Generic;
using System.Linq;
using Windows.ApplicationModel.Contacts;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
using XamlDemo.Common;
    
namespace XamlDemo.Picker
{
    public sealed partial class ContactPickerDemo : Page
    {
        public ContactPickerDemo()
        {
            this.InitializeComponent();
        }
    
        private async void btnPickContact_Click(object sender, RoutedEventArgs e)
        {
            if (Helper.EnsureUnsnapped())
            {
                ContactPicker contactPicker = new ContactPicker();
                contactPicker.CommitButtonText = "確定";
                contactPicker.SelectionMode = ContactSelectionMode.Contacts;
    
                // 啟動聯系人選取器,以選擇一個聯系人
                ContactInformation contact = await contactPicker.PickSingleContactAsync();
    
                if (contact != null)
                {
                    lblMsg.Text = "name: " + contact.Name;
                    lblMsg.Text += Environment.NewLine;
                    lblMsg.Text += "emails: " + string.Join(",", contact.Emails.Select(p => new { email = p.Value }));
                    lblMsg.Text += Environment.NewLine;
                    lblMsg.Text += "phoneNumbers: " + string.Join(",", contact.PhoneNumbers.Select(p => new { phoneNumber = p.Value }));
    
                    IRandomAccessStreamWithContentType stream = await contact.GetThumbnailAsync();
                    if (stream != null && stream.Size > 0)
                    {
                        BitmapImage bitmap = new BitmapImage();
                        bitmap.SetSource(stream);
                        imgThumbnail.Source = bitmap;
                    }
                }
                else
                {
                    lblMsg.Text = "取消了";
                }
            }
        }
    
        private async void btnPickContacts_Click(object sender, RoutedEventArgs e)
        {
            if (Helper.EnsureUnsnapped())
            {
                var contactPicker = new ContactPicker();
    
                // 啟動聯系人選取器,以選擇多個聯系人
                IReadOnlyList<ContactInformation> contacts = await contactPicker.PickMultipleContactsAsync();
    
                if (contacts != null && contacts.Count > 0)
                {
                    ContactInformation contact = contacts[0];
    
                    lblMsg.Text = "contacts count: " + contacts.Count.ToString();
                    lblMsg.Text += Environment.NewLine;
                    lblMsg.Text += "first contact name: " + contact.Name;
                    lblMsg.Text += Environment.NewLine;
                    lblMsg.Text += "first contact emails: " + string.Join(",", contact.Emails.Select(p => new { email = p.Value }));
                    lblMsg.Text += Environment.NewLine;
                    lblMsg.Text += "first contact phoneNumbers: " + string.Join(",", contact.PhoneNumbers.Select(p => new { phoneNumber = p.Value }));
    
                    IRandomAccessStreamWithContentType stream = await contact.GetThumbnailAsync();
                    if (stream != null && stream.Size > 0)
                    {
                        BitmapImage bitmap = new BitmapImage();
                        bitmap.SetSource(stream);
                        imgThumbnail.Source = bitmap;
                    }
                }
                else
                {
                    lblMsg.Text = "取消了";
                }
            }
        }
    }
}

OK

[源碼下載]:http://files.cnblogs.com/webabcd/Windows8.rar

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved