博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【WP8.1开发】选择与搜索联系人
阅读量:5253 次
发布时间:2019-06-14

本文共 4452 字,大约阅读时间需要 14 分钟。

在需要的情况下,可以通过相关的API来访问手机上的联系人信息;当然,在不必要的情况下,不要随便去获取别人的数据。

要从联系人列表中选择并获取一位或者N位联系人的详细信息,比较简单的做法是利用ContactPicker。该类会弹出系统集成的联系人选择界面,用户直接通过界面操作选择需要的联系人。当用户做出选择后,会将选择结果返回给调用方。

一位联系人的具体信息由Contact类封装,比如手机号码、姓名、住址等,有关该类的具体成员我就不一一说了,那样多没意思,用VS的人都应该经常打开“对象浏览器”窗口玩玩,这个窗口非常好玩,经常会遇到不少人老喜欢问:XXX类在哪个命名空间下? 岂有此理!你是第一天用VS吗? 自己不会打开“对象浏览器”去看看吗? 所以,以后我的博文中不会再告诉你某个类在哪个命名空间下,你自己要知道如何去找。

使用ContactPicker类来选择联系人非常简单,用下面的例子演示一下你就会明白了。

这个例子用两个RadioButton控件做选择,即选择单个联系人还是选择多个。

手机:

ListBox控件用来显示被选择的联系人的信息,例子中,我只显示DisplayName(显示名)和Phones(手机号码列表)两个字段,其他就不列举了,这样简洁一点。

下面代码将使用ContactPicker来选择联系人。

ContactPicker _contactPicker = new ContactPicker();            // 必须设置以下项            _contactPicker.DesiredFieldsWithContactFieldType.Add(ContactFieldType.PhoneNumber);            // 选择单个联系人            if (rdbSingle.IsChecked == true)            {                Contact singleContact = await _contactPicker.PickContactAsync();                if (singleContact != null)                {                    IList
contacts = new List
(); contacts.Add(singleContact); lb.ItemsSource = contacts; } } // 选择多个联系人 if (rdbMulti.IsChecked == true) { lb.ItemsSource = await _contactPicker.PickContactsAsync(); }

建议在每次使用的时候才实例化ContactPicker,不要在页面类级别实例化,因为当用户选择完联系人后,系统会将ContactPicker实例中的某些内容清理,当第二次访问时就会发生异常。我们知道,RT的API其实是以COM形式出现的,只是用托管代码进行了封装。

说到这里,又想起一件事,前不久看到有人怀疑WPF是否被RT取代的言论。其实那不准,RT程序主要面向像ARM一些移动CPU的,或者说它专用于移动终端平台,像平板手机等;而WPF是用于桌面环境的,之所以会从WPF产生像RT这样的子集,就是考虑到移动终端是不能和桌面系统相比的,CPU架构也存在不同。哪怕是相同参数的CPU,移动版的性能其实是缩水的,不能与PC上的CPU比,应该要区分它们的用途。

不管怎样,.net上的各种东西都是一脉相承的,你只要有扎实的WPF基础,那么在Silverligt、RT等内容上你几乎不需要学习就可以马上开工。任何事物都是处于不断变化之中,.NET不管它怎么更新,其主要的东西是不变的,所以有些人总感觉学习成本高。我告诉你,你觉得学习成本高,那是因为你本身基础就不扎实,而且这种不扎实还会随着时间一点一点地积累的。如果你在学习.net的时候注重打基本功,无论它怎么变,对你来说影响是不大的,要学会知识迁移

我用一句话总结一下,学会以下几个东西,基本上.net就没问题了——编程语言基础 + WCF、WPF、ASP.NET

 

不扯废话了,回归话题。在ContactPicker的时候,有两个方法可以选择:

1、PickContactAsync:只选择一个联系人,返回单个Contact实例。

2、PickContactsAsync:多选。返回一个Contact列表,表示已被选择的联系人。

 

以下代码是必须的,如果没有会发生异常:

            // 必须设置以下项

            _contactPicker.DesiredFieldsWithContactFieldType.Add(ContactFieldType.PhoneNumber);

ContactFieldType指定以什么类型去选取联系人,你至少要Add一个,我这里只用到PhoneNumber,表示选择是以联系人的电话号码为基准的,如果是Email,就表示以选取电邮地址为基准,通常是选择电话号码多一些。

 

现在,可以测试一下。

选择多个      

 

===================================================

以上方法尽管比吃西瓜还简单,但似乎缺少了些灵活性。尤其是我们希望想通过自己设计的UI来显示、查找联系人的时候,就不应该再使用系统默认的选择器。

因此,可以使用另一种方法来获取联系人信息,这种方法是”无界面“的,而是直接通过代码来获取,这样我们可以自己来设计显示联系人列表的界面,或者可以加入自己的搜索功能。

ContactStore公开以下几个方法,可以获取联系人信息。

FindContactsAsync:方法有两个重载,不带任何参数的重载将获取所有联系人;带一个string参数的版本可以根据参数进行搜索,比如,联系人列表存在以下三个人:毛线、毛丫子、苟毛,那么当调用FindContactsAsync方法并把字符串”毛“传递进去后,就会返回这三个联系人信息。

利用这点,我们就可以实现自己的搜索功能。比如下面XAML:

TextBox用于输入搜索关键字,通过处理TextChanged事件,可以在输入的文本发生变化后立即完成搜索,并将搜到的结果显示在ListView控件中。ListView中只显示搜到的联系人的显示名,当用户点击ListView中的项时,会把该联系人的ID、姓名、手机号码显示在TextBlock中。

private async void OnTextChanged ( object sender, TextChangedEventArgs e )        {            IReadOnlyList
contacts = null; if (string.IsNullOrWhiteSpace(txtInput.Text)) { // 如果输入为空,就查找所有联系人 contacts = await _store.FindContactsAsync(); } else { contacts = await _store.FindContactsAsync(txtInput.Text); } lv.ItemsSource = contacts; }

 

ContactStore类在使用前并不能直接实例化,它是通过ContactManager类的RequestStoreAsync静态方法返回。

_store = await ContactManager.RequestStoreAsync();

 

使用这种方法获取联系人信息,请必须打开清单文件,在”功能“选项卡下勾选”联系人“,然后保存,否则应用程序无权限访问联系人。

 

好了,现在再看看这个例子的结果。

    

 

下面是本文两个示例的源代码下载地址:

 

关于联系人管理,下一篇文章再向大家介绍有点复杂的第三种方案。

 

转载于:https://www.cnblogs.com/tcjiaan/p/4175613.html

你可能感兴趣的文章
CodeChef - RIN 最小割应用 规划问题
查看>>
设计模式之组合模式
查看>>
百度分享如何自定义分享url和内容?
查看>>
php抓取post方式提交的页面
查看>>
php简单缓存类
查看>>
文件中查找
查看>>
20145313张雪纯网络攻防第二次实验
查看>>
人人网JavaScript面试题
查看>>
Kontln的属性形式Getter和Setter
查看>>
win10 bcdedit加入vhdx启动
查看>>
Linux 黑白界面显示
查看>>
ActiveMQ学习系列(四)----消息持久化到mysql
查看>>
JavaScript设计模式基础之面向对象的JavaScript(一)
查看>>
RabbitMQ-从基础到实战(4)— 消息的交换(中)
查看>>
mysql 索引数据结构及原理
查看>>
01.Hibernate入门
查看>>
Ubuntu 16.0.4开启 log-bin
查看>>
mongoDB的学习【小白的福音】
查看>>
Spring boot中Spring-Data-JPA操作MySQL数据库时遇到的错误(一)
查看>>
django实现SSO
查看>>