惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
P
Palo Alto Networks Blog
月光博客
月光博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
InfoQ
aimingoo的专栏
aimingoo的专栏
腾讯CDC
T
Threatpost
D
DataBreaches.Net
Vercel News
Vercel News
F
Fortinet All Blogs
Engineering at Meta
Engineering at Meta
C
Cybersecurity and Infrastructure Security Agency CISA
Forbes - Security
Forbes - Security
U
Unit 42
C
Check Point Blog
Blog — PlanetScale
Blog — PlanetScale
O
OpenAI News
量子位
TaoSecurity Blog
TaoSecurity Blog
Microsoft Azure Blog
Microsoft Azure Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Visual Studio Blog
Recorded Future
Recorded Future
云风的 BLOG
云风的 BLOG
Security Archives - TechRepublic
Security Archives - TechRepublic
The Last Watchdog
The Last Watchdog
S
Security Affairs
Attack and Defense Labs
Attack and Defense Labs
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
小众软件
小众软件
S
SegmentFault 最新的问题
www.infosecurity-magazine.com
www.infosecurity-magazine.com
W
WeLiveSecurity
AI
AI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - 聂微东
I
Intezer
Know Your Adversary
Know Your Adversary
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Cloudflare Blog
博客园_首页
NISL@THU
NISL@THU
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客园 - Allen Lee

用R处理一组数据的三种方式 遇见C++ AMP:GPU的线程模型和内存模型 遇见C++ AMP:在GPU上做并行计算 遇见C++ PPL:C++ 的并行和异步 遇见C++ Lambda WP7有约(八):在ListPicker控件的选择页面上播放铃声 WP7有约(六):AppBarUtils使用指南 WP7有约:一个应用的破蛋过程 WP7有约(五):回到主页 WP7有约(四):课程全景 WP7有约(三):课堂重点 WP7有约(二):课后作业 WP7有约(一):课程安排 Ruby 101:行为驱动 Ruby 101:动态编程 Ruby 101:方法对象 Ruby 101:对象和方法 Ruby 101:重用、隐藏和多态 - Allen Lee Ruby 101:类和对象
WP7有约(七):实现铃声设置的播放图标的效果
Allen Lee · 2011-12-07 · via 博客园 - Allen Lee

WP7有约(七):实现铃声设置的播放图标的效果

Written by Allen Lee

      sjcxyf同学通过站内消息提到这样一个问题:

我现在想做一个功能就是当ListPicker弹出全屏幕的时候每一项前面是一个播放图片,后面是音乐名称,然后我点击前面的播放的时候播放当前的音乐,不让他选择这一项的值并返回 要选择后面的字之后才返回 就是像Phone 7真机里面设置铃声那种效果怎么做?

      我们来看一个山寨版的铃声设置,如图1所示,无论用户单击铃声名字还是它左边那个播放图标,都会关闭ListPicker页面。sjcxyf同学想要的效果是单击播放图标将会播放对应的铃声,而单击铃声名字才是确认选择。问题是,即使你单击铃声下面的空白地方,ListPicker页面也会关闭,为什么?

图 1 山寨版铃声设置

      查看ListPickerPage.xaml.cs文件,我们将会发现ListPicker页面的ListBox控件添加了Tap事件处理程序,如代码1所示。从中我们不难看出,ListPicker页面表现出来的行为是预期的,即在单选模式下,单击ListBox控件里的选项或者空白地方将会关闭ListPicker页面。于是,sjcxyf同学的需求可以重新描述成在用户单击播放图标时防止ListBox控件的事件处理程序被执行,但是,怎样才能做到?

代码 1 ListBox控件的Tap事件处理程序

private void OnPickerTapped(object sender, System.Windows.Input.GestureEventArgs e)
{
// We listen to the tap event because SelectionChanged does not fire if the user picks the already selected item.// Only close the page in Single Selection mode.
if (SelectionMode == SelectionMode.Single)
{
// Commit the value and close
SelectedItem = Picker.SelectedItem;
ClosePickerPage();
}
}

      Silverlight支持一种叫做路由事件(routed event)的概念,这种事件的触发会从子元素沿着对象树向上传递给各个父元素,直至到达根元素为止。并非所有事件都是路由事件,但Tap事件刚好就是路由事件,换句话说,当用户单击播放图标时,ListBox控件作为播放图标的父元素,虽然不是直接包含的父元素,也能感知传递过来的Tap事件。于是,sjcxyf同学的需求可以重新描述成防止播放图标的Tap事件向上传递给父元素,但是,怎样才能做到?

      Tap事件处理程序的第二个参数有一个Handled属性,这个属性正是用来处理这种需求的。假设播放图标是一个Image控件,如代码2所示,我们可以为它添加一个Tap事件处理程序,并在里面把Handled属性设为true,如代码3所示,这样,Silverlight的事件系统将会停止把Tap事件向上传递给各个父元素。

代码 2 播放图标的XAML代码

<Image Source="/play.png" Stretch="None" HorizontalAlignment="Left" 
VerticalAlignment
="Center" Tap="Image_Tap" Margin="0,0,12,0"/>

代码 3 播放图标的Tap事件处理程序

private void Image_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
// 添加播放音乐的代码

e.Handled = true;
}

      不过,当用户单击播放图标时,当前选中的铃声也会发生改变,这显然不是Windows Phone 7的铃声设置的做法。我们希望单击播放图标时只是播放铃声,但不改变当前选中的铃声,如果此时按Back键返回,铃声设置将会维持原状。这个效果的实现方式和前面的一样,只不过这次换成了MouseLeftButtonUp事件,因此我把它留给你课后实践一下。