【WP8.1开发】选择与搜索联系人
在需要的情况下,可以通过相关的API来访问手机上的联系人信息;当然,在不必要的情况下,不要随便去获取别人的数据。
要从联系人列表中选择并获取一位或者N位联系人的详细信息,比较简单的做法是利用ContactPicker。该类会弹出系统集成的联系人选择界面,用户直接通过界面操作选择需要的联系人。当用户做出选择后,会将选择结果返回给调用方。
一位联系人的具体信息由Contact类封装,比如手机号码、姓名、住址等,有关该类的具体成员我就不一一说了,那样多没意思,用VS的人都应该经常打开“对象浏览器”窗口玩玩,这个窗口非常好玩,经常会遇到不少人老喜欢问:XXX类在哪个命名空间下? 岂有此理!你是第一天用VS吗? 自己不会打开“对象浏览器”去看看吗? 所以,以后我的博文中不会再告诉你某个类在哪个命名空间下,你自己要知道如何去找。
使用ContactPicker类来选择联系人非常简单,用下面的例子演示一下你就会明白了。
这个例子用两个RadioButton控件做选择,即选择单个联系人还是选择多个。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Orientation="Vertical">
<Button Content="选择联系人" Click="PickContacts"/>
<RadioButton Name="rdbSingle" Content="选择单个" IsChecked="True" GroupName="g1"/>
<RadioButton Name="rdbMulti" Content="选择多个" GroupName="g1"/>
</StackPanel>
<ListBox Name="lb" Grid.Row="1" Margin="5">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Foreground="Green" FontSize="26" Text="{Binding DisplayName}"/>
<ItemsControl Margin="7,0,0,0" ItemsSource="{Binding Phones }">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock FontSize="20">
手机:<Run Text="{Binding Number}"/>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
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<Contact> contacts = new List<Contact>();
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:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBox Name="txtInput" TextChanged="OnTextChanged"/>
<ListView x:Name="lv" Grid.Row="1" ItemClick="OnItemClick" IsItemClickEnabled="True">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock FontSize="24" Text="{Binding DisplayName}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
TextBox用于输入搜索关键字,通过处理TextChanged事件,可以在输入的文本发生变化后立即完成搜索,并将搜到的结果显示在ListView控件中。ListView中只显示搜到的联系人的显示名,当用户点击ListView中的项时,会把该联系人的ID、姓名、手机号码显示在TextBlock中。
private async void OnTextChanged ( object sender, TextChangedEventArgs e )
{
IReadOnlyList<Contact> 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();
使用这种方法获取联系人信息,请必须打开清单文件,在”功能“选项卡下勾选”联系人“,然后保存,否则应用程序无权限访问联系人。
好了,现在再看看这个例子的结果。
下面是本文两个示例的源代码下载地址:
http://files.cnblogs.com/tcjiaan/sampleSrcs.zip
关于联系人管理,下一篇文章再向大家介绍有点复杂的第三种方案。
【WP8.1开发】选择与搜索联系人的更多相关文章
- 如何开发自己的搜索帝国之ES图形化Kibana安装与使用
在如何开发自己的搜索帝国之Elasticsearch中已经介绍安装好了ES,下面就Kibana对ES的查询监控作介绍,就是常提到的大数据日志处理组件ELK里的K. 什么是Kibana?现引用园友的一段 ...
- WP8.1开发:简单天气预报应用(转)
今天小梦给大家分享一个简单的天气预报应用源码:调用的是百度API.整个应用都没有什么难点.只是一个简单的网络请求和json数据处理.在WP8.1有小娜的情况下,天气预报应用还有意义吗?我认为还是有点意 ...
- WP8.1开发:简单的天气预报应用
今天小梦给大家分享一个简单的天气预报应用源码:调用的是百度API.整个应用都没有什么难点.只是一个简单的网络请求和json数据处理.在WP8.1有小娜的情况下,天气预报应用还有意义吗?我认为还是有点意 ...
- FlexPaper二次开发问题及搜索高亮显示
原文:FlexPaper二次开发问题及搜索高亮显示 最近有个需求,做一个IT知识库,类似于文库,说到文库肯定会用到在线浏览文档了,所有在网上翻阅了一下类似豆丁的在线浏览器插件的资料,将其进行了二次开发 ...
- C# Windows Phone 8 WP8 高级开发,制作不循环 Pivot ,图片(Gallery)导览不求人! 内附图文教学!!
原文:C# Windows Phone 8 WP8 高级开发,制作不循环 Pivot ,图片(Gallery)导览不求人! 内附图文教学!! 一般我们在开发Winodws Phone APP 的时候往 ...
- 解决:People下面选择分享可见联系人,选择多个联系人后通过短信分享,短信中只显示一个联系人
问题描述: [操作步骤]:People下导入导出中选择分享可见联系人,选择多个联系人后通过短信分享 [测试结果]:短信中只能显示一个联系人 [预期结果]:可以显示多个联系人 经过代码分析,从compo ...
- OpenERP(odoo)开发实例之搜索检索过去3个月的数据
转自:http://www.chinamaker.net/ OpenERP(odoo)开发实例之搜索过滤:检索过去3个月的数据 解决这个问题的重点在于 relativedelta 的应用 示例代码如下 ...
- iOS开发实战之搜索控制器UISearchController使用
当tableView中的数据过多的时候,在tableView上加一个搜索框就变的很必要了,本文就讨论搜索控制器的使用,以及谓词的简单实现. .m文件中代码如下 添加搜索控制器的各种协议 <UIS ...
- 【WP8.1开发】基于应用的联系人存储
上一篇文章所吹的牛是访问系统(手机)上的联系人,当然那只是读不能改,这是自然的,要是让你能随便修改用户的联系人信息的话,那后果很严重,有些恶意开发者就有可能把”你的户口改成猪“. 但是,API也允许应 ...
随机推荐
- C#学习之Stream
上节课老师主要讲了stream及其一些运用和实例,下面我们就来讨论讨论Stream. 我们知道,C#中常用的stream有文件流(FileSteam),内存流(MemoryStream),压缩流(GZ ...
- 转 jdk1.5新特性 ConcurrentHashMap
ConcurrentHashMap特点:效率比Hashtable高,并发性比hashmap好.结合了两者的特点. 集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的支持 ...
- 关于css3媒体查询和响应式布局
响应式设计 响应式设计可根据所显示的屏幕大小而改变, 它呈现的每个屏幕看起来并不相同.按照可用的屏幕属性,响应式设计提供了 UI 的最佳效果. 例如,如果网站布局上有一个占据 25% 的屏幕宽度的侧边 ...
- web编程 java.io.EOFException错误
java.io.EOFException 严重: IOException while loading persisted sessions: java.io.EOFException 严重: Exce ...
- xampp开启php-debug
[XDebug]zend_extension = "C:\xampp\php\ext\php_xdebug.dll";xdebug.profiler_append = 0;xdeb ...
- C# - JSON详解
最近在做微信开发时用到了一些json的问题,就是把微信返回回来的一些json数据做一些处理,但是之前json掌握的不好,浪费了好多时间在查找一些json有关的转换问题,我所知道的方法只有把json序列 ...
- 解决Ubuntu Server 12.04 在Hyper-v 2012 R2中不能使用动态内存的问题
前言 全新Hyper-v 2012 R2终于开始支持在Linux的VPS中使用动态内存,可以大大优化服务器的资源分配,小弟我兴奋不已,于是抽空时间赶紧升级到 2012 R2,好好整理一番内存分配,不过 ...
- 开始VS 2012 中LightSwitch系列的第1部分:表中有什么?描述你的数据
[原文发表地址] Beginning LightSwitch in VS 2012 Part 1: What’s in a Table? Describing Your Data [原文发表时间] ...
- 我的ORM之十一 -- 缓存
我的ORM索引 对某一个查询频繁重复,应该使用缓存. 缓存应该是可以配置. 配置 Web.config: <configuration> <configSections> &l ...
- javascript 设计模式-----享元模式
四个轮子,一个方向盘,有刹车,油门,车窗,这些词首先让人联想到的就是一辆汽车.的确,这些都是是一辆车的最基本特征,或者是属性,我们把词语抽象出来,而听到这些词语的人把他们想象陈一辆汽车.在代码里面也是 ...