重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口

简介: 原文:重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口[源码下载] 重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口 作者:webabcd介绍重新想象 Windo...
原文: 重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口

[源码下载]


重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口



作者:webabcd


介绍
重新想象 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
[源码下载]

目录
相关文章
|
2月前
|
C++ Windows
Windows10添加自定义右键菜单VS Code
本文介绍了如何在Windows 10中通过修改注册表,将VS Code添加到右键菜单,实现右键文件、文件夹或空白处时使用VS Code打开。方法同样适用于其他程序,如Sublime Text 3。
|
4月前
|
Android开发 数据安全/隐私保护 开发者
Android自定义view之模仿登录界面文本输入框(华为云APP)
本文介绍了一款自定义输入框的实现,包含静态效果、hint值浮动动画及功能扩展。通过组合多个控件完成界面布局,使用TranslateAnimation与AlphaAnimation实现hint文字上下浮动效果,支持密码加密解密显示、去除键盘回车空格输入、光标定位等功能。代码基于Android平台,提供完整源码与attrs配置,方便复用与定制。希望对开发者有所帮助。
|
5月前
|
人工智能 JSON 小程序
【一步步开发AI运动APP】七、自定义姿态动作识别检测——之规则配置检测
本文介绍了如何通过【一步步开发AI运动APP】系列博文,利用自定义姿态识别检测技术开发高性能的AI运动应用。核心内容包括:1) 自定义姿态识别检测,满足人像入镜、动作开始/停止等需求;2) Pose-Calc引擎详解,支持角度匹配、逻辑运算等多种人体分析规则;3) 姿态检测规则编写与执行方法;4) 完整示例展示左右手平举姿态检测。通过这些技术,开发者可轻松实现定制化运动分析功能。
|
3月前
《仿盒马》app开发技术分享-- 自定义标题栏&商品详情初探(9)
上一节我们实现了顶部toolbar的地址选择,会员码展示,首页的静态页面就先告一段落,这节我们来实现商品列表item的点击传值、自定义标题栏。
74 0
|
4月前
|
人工智能 小程序 API
【一步步开发AI运动APP】九、自定义姿态动作识别检测——之关键点追踪
本文介绍了【一步步开发AI运动APP】系列中的关键点追踪技术。此前分享的系列博文助力开发者打造了多种AI健身场景的小程序,而新系列将聚焦性能更优的AI运动APP开发。文章重点讲解了“关键点位变化追踪”能力,适用于动态运动(如跳跃)分析,弥补了静态姿态检测的不足。通过`pose-calc`插件,开发者可设置关键点(如鼻子)、追踪方向(X或Y轴)及变化幅度。示例代码展示了如何在`uni-app`框架中使用`createPointTracker`实现关键点追踪,并结合人体识别结果完成动态分析。具体实现可参考文档与Demo示例。
|
8月前
|
Dart 前端开发
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
262 75
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
5月前
|
人工智能 小程序 API
【一步步开发AI运动APP】八、自定义姿态动作识别检测——之姿态相似度比较
本文介绍了如何通过姿态相似度比较技术简化AI运动应用开发。相比手动配置规则,插件`pose-calc`提供的姿态相似度比较器可快速评估两组人体关键点的整体与局部相似度,降低开发者工作量。文章还展示了在`uni-app`框架下调用姿态比较器的示例代码,并提供了桌面辅助工具以帮助提取标准动作样本,助力开发者打造性能更优、体验更好的AI运动APP。
|
8月前
|
Dart 前端开发 容器
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
230 18
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
安全 前端开发 API
【Azure 应用服务】Azure Web App 服务默认支持一些 Weak TLS Ciphers Suite,是否有办法自定义修改呢?
【Azure 应用服务】Azure Web App 服务默认支持一些 Weak TLS Ciphers Suite,是否有办法自定义修改呢?
163 4
|
7月前
|
开发框架 缓存 搜索推荐
PiliPala:开源项目真香,B站用户狂喜!这个开源APP竟能自定义主题+去广告?PiliPala隐藏功能大揭秘
嗨,大家好,我是小华同学。PiliPala 是一个基于 Flutter 开发的 BiliBili 第三方客户端,提供流畅、个性化的使用体验。核心功能包括视频浏览与推荐、用户互动、丰富的播放设置、多维度搜索和个性化主题等。相比官方客户端,PiliPala 功能更丰富、性能更优、界面更美观。
334 14

热门文章

最新文章