【跟Z学开发】1.4 探索交互式通知(引子)

zcxsythenew UID.911687
2017-07-17 发表

本帖最后由 zcxsythenew 于 2017-7-17 20:47 编辑

专题一 开发一个媒体播放应用
课题4 探索交互式通知(引子)

语言:C#、XML

本节包含:
生成和发送本地通知
创建和读取XML文档
从安装文件夹读取文件

我们上节课已经做出了手机版的更简陋的播放器,这节课我们通过交互式通知继续做电脑版。

建议下载:Notifications Visualizer[app]9nblggh5xsl1[/app][backcolor=red]请从电脑的网页版浏览此教程。[/backcolor][page]专题一 开发一个媒体播放应用
课题4 探索交互式通知(引子)

我们先来参观一下用于通知的几种XML。可以复制到Notifications Visualizer体验一下。

1.最简陋的通知(简陋得令人发指)[mw_shl_code=xml,true]<toast />[/mw_shl_code]***附件停止解析***

2.给它添加一些必需的结构(但内容仍然是空的)[mw_shl_code=xml,true]<toast>

<visual>
<binding template="ToastGeneric">

</binding>
</visual>

</toast>[/mw_shl_code]***附件停止解析***

3. 给它静音(仍然是空内容)[mw_shl_code=xml,true]<toast>

<visual>
<binding template="ToastGeneric">

</binding>
</visual>

<audio silent="true" />
</toast>[/mw_shl_code]***附件停止解析***

4. 加一行字[mw_shl_code=xml,true]<toast>

<visual>
<binding template="ToastGeneric">
<text>点击此处开始播放。</text>
</binding>
</visual>

<audio silent="true" />
</toast>[/mw_shl_code]***附件停止解析***[page]专题一 开发一个媒体播放应用
课题4 探索交互式通知(引子)

事实上,前一页所提到的这几种XML,只要再添加一个属性,就可以让播放器在后台启动了。但是,Windows 10的交互式通知,不加上几个按钮,总觉得心里空落落的。

5. 添加一个按钮[mw_shl_code=xml,true]<toast>

<visual>
<binding template="ToastGeneric">
<text>点击此处开始播放。</text>
</binding>
</visual>

<audio silent="true" />

<actions>
<action content="开始" arguments="start"></action>
</actions>

</toast>[/mw_shl_code]***附件停止解析***

6. 只有“开始”没有“取消”,会不会有一种Qin定的感觉?[mw_shl_code=xml,true]<toast>

<visual>
<binding template="ToastGeneric">
<text>点击此处开始播放。</text>
</binding>
</visual>

<audio silent="true" />

<actions>
<action content="开始" arguments="start"></action>
<action content="取消" arguments="cancel"></action>
</actions>

</toast>[/mw_shl_code]***附件停止解析***[page]专题一 开发一个媒体播放应用
课题4 探索交互式通知(引子)

我们选择上一页的第6种方案,也就是最复杂的那一个。
我们还要对这个XML做一些处理,以让它不在前台激活应用。(激活OnActivated我们还没有学。)

首先,我们对toast添加一个属性activationType="background",当点击通知主体“点击此处开始播放”这行字的时候,能够从后台启动音频。

然后,我们还要对“开始”按钮做同样的操作。

现在,我们点击通知主体和“开始”按钮,都能够启动后台的任务了。现在剩下“取消”了。我们把activationType设置为“system”,将arguments改为dismiss,Windows就会自动处理这个“取消”按钮。此时,我们可以把content属性清空,系统就会自动把“dismiss”翻译为各国语言,并作为这个按钮的content。(但是我们的课程并不打算讲多语言,有兴趣的可以到官网查询。)

XML代码如下:[mw_shl_code=xml,true]<toast activationType="background">

<visual>
<binding template="ToastGeneric">
<text>点击此处开始播放。</text>
</binding>
</visual>

<audio silent="true" />

<actions>
<action content="开始" arguments="start" activationType="background"></action>
<action content="" arguments="dismiss" activationType="system"></action>
</actions>

</toast>[/mw_shl_code][page]专题一 开发一个媒体播放应用
课题4 探索交互式通知(引子)

我们的XML已经准备好了。下面,我们要把XML搬到C#代码里面去。

首先,我们解开注册后台任务的代码,让它“重见天日”。

***附件停止解析***

虽然UWP说是全平台通用,但是各种设备表现不一是常有的事,就像我们上节课讲过的“共享生命周期”。有时候我们要对手机和电脑分别处理,在C#中,可以用如下代码:[mw_shl_code=csharp,true]if (AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Desktop")[/mw_shl_code]我们用if把注册后台任务的代码包围起来,用else把上节课的代码包围起来。如果没有错的话,else里面只有两行。如果你上节课添加了return;,把它放在外面。

现在我们的代码已经越写越长了,阅读起来很不方便。注册后台任务的代码我们不会再动它,那么我们可以把它提取出来。我们把注册后台任务的代码全部选中,点击灯泡,然后选择“提取方法”。

***附件停止解析***

Visual Studio会提示我们改名。为了方便阅读,我们可以改为“RegisterBackgroundTask”,当然理论上讲,你可以改为任意的其它名字,也可以不改。

注意到这个方法前面有await,它会等待后台任务注册完成了以后,再做后面的操作。我们评估一下是否需要——肯定是要的,因为我们注册完后台任务,发送好通知以后,顺手就把前台进程退了。不能到了这个时候,后台任务还没注册好,那要出问题的。

我们可以把代码滚动到下面,注意到这个新的函数的返回类型是Task。返回Task或者Task<T>的函数才可以await。[page]专题一 开发一个媒体播放应用
课题4 探索交互式通知(引子)

下面我们真的要开始把XML搬进去了。这里有5种解决方案。
在此之前,要说明一点,给XmlDocument添加using的时候,应当选择using Windows.Data.Xml.Dom。另外一种XmlDocument在UWP中比较少用。

方案1 从零开始创建XML

这个方案是检测你XML学得好不好的一个办法。读懂这一串代码的难度,请参考高考数学的最后一题。

你可以比对一下前面的XML,也许有助于你理解。

***附件停止解析***

虽然几乎没有人这么写,但是这也不是一无是处。有的人可能不希望别人轻易地拿到他的代码,于是在他有十足的把握不会出Bug的情况下,他会故意把泄露风险比较大的代码弄得一团糟(比如把函数全部展开放到调用这个函数的代码里面)。即使别人拿到了代码,也不知道是什么意思。

方案2 字符串转XML

***附件停止解析***

这样的代码更容易理解了(电脑可能不这么想)。但是,你要把每个双引号替换为“\"”;要给每一行用双引号包围;除了最后一行外,每一行要添一个加号。如果你不喜欢这种机械工作,方案3会提供另外一种方法。

方案3 文件读取XML

首先,我们先要创建一个XML文档。右键单击项目,选择“添加”>“新建项”,选择XML文件。这样会把文件放到根目录下。你也可以新建文件夹,把文件添加到里面。一般来讲,Assets是放图片而不是XML的。

把XML原样粘贴上去,什么也不用处理。

***附件停止解析***
(心里莫名的舒畅)

在C#中,用以下代码获取文件:[mw_shl_code=csharp,true]StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///ToastXML.xml"));[/mw_shl_code]

把ToastXML.xml改为你使用的文件名。如果你把XML放在FolderA文件夹下,那么就把"ms-appx:///ToastXML.xml"改为"ms-appx:///FolderA/ToastXML.xml"。

***附件停止解析***

以上三种方法,各适用于不同的需求。你可能觉得,方案3已经是最简单的方法了,肯定要选方案3。但是要注意,方案3涉及文件读取,在代码运行的过程中,它可能是运行得最慢的方法。你可以从图片里看到,这种方法用了两个await。[page]专题一 开发一个媒体播放应用
课题4 探索交互式通知(引子)

方案4

微软还提供了一种方法,就是直接用C#来创建通知。首先,你要在Visual Studio中,点击工具>NuGet包管理器>程序包管理器控制台。等待“PM>”字符出现,然后输入
Install-Package Microsoft.Toolkit.Uwp.Notifications
按回车键并等待完成。

用C#创建一个一模一样的通知,代码如下:[mw_shl_code=csharp,true] ToastContent content = new ToastContent();
content.Visual = new ToastVisual();
content.Visual.BindingGeneric = new ToastBindingGeneric();
AdaptiveText text = new AdaptiveText();
text.Text = "点击此处开始播放。";
content.Visual.BindingGeneric.Children.Add(text);
ToastActionsCustom custom = new ToastActionsCustom();
ToastButton button = new ToastButton("开始", "start");
button.ActivationType = ToastActivationType.Background;
custom.Buttons.Add(button);
ToastButtonDismiss dismiss = new ToastButtonDismiss();
custom.Buttons.Add(dismiss);
content.Actions = custom;
ToastAudio audio = new ToastAudio();
audio.Silent = true;
content.Audio = audio;
content.ActivationType = ToastActivationType.Background;
XmlDocument xml = content.GetXml();[/mw_shl_code]当然微软不可能搞那么难看的代码。这么难看的代码是我搞的。
我们第一节课讲过可以把赋值代码放到new里面。我在这里再加上一条:
可以嵌套。
如果你把这些代码放到Visual Studio里面,你会发现有好多个new下面都有三个点。

***附件停止解析***

现在你负责简化它们(即方案5)。另外讲一句,简化了以后的代码会非常漂亮。[page]专题一 开发一个媒体播放应用
课题4 探索交互式通知(引子)

不论你使用哪一种方案,最后都得到了一个XmlDocument。以下代码可以发送通知。[mw_shl_code=csharp,true]ToastNotification toastNotif = new ToastNotification(xml);
ToastNotificationManager.CreateToastNotifier().Show(toastNotif);[/mw_shl_code]

你可以把刚刚用来发送通知的代码选中,然后提取方法以便阅读。

然后,调用App.Current.Exit();关闭前台。

最后还有几项需要注意。
1. 在双进程的后台播放中,不需要在“功能”里面勾选“背景媒体播放”。只有单进程需要。
2. 在电脑上应该使用自动的方式连接音量控制。否则……你可以试一试。[page]下节预告

本节课讲的交互式通知,也只是个引子,因为我们还不曾真正地处理通知内包含的具体信息。但是对于这么一个简陋的播放器来说,已经足够了。更多的内容,会在后面学习。

现在,你的第一个UWP应用就真的完成了。从下节课开始,我们不再用这个解决方案。

下节课开始,我们就要开始接触XAML。我们首先,仍然是做一个非常简陋的界面:

***附件停止解析***
(里面的按钮都是真的。)

这个界面是最简单的播放器界面了。即使是我们后面会讲到的画中画模式,窗口也比这个大几倍。我们会在这个最简单的界面花费相当长的一段时间。

你可能留意到,这个界面用了亚克力效果。亚克力是选学内容。选学内容并不意味着难度提升,只意味着你需要升级Windows 10,并安装预览版SDK。

本系列将暂停更新7天,等我先把这个播放器写好。在此期间,你可以浏览智机网置顶的UWP视频(***链接停止解析***)。我们7月24日19:00见。

[backcolor=red]请投票选择“打卡签到”,谢谢。[/backcolor]

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
AFAN-World UID.2879093
2017-07-17 使用 Lumia 640 XL 回复

虽然是交互的引子,不过还是想以旁白的身份说一下,这样的设计是违反Windows UI设计原则的。 Toast通知里面不能含有任何“单击此处以xxx”的字样,因为toast本身就是用来提醒,通知的,而不是用来交互。更不用说在“单击此处”下面加上“开始/确定”的按钮了。 也就是说,这个交互本身就不适合作为toast呈现。 但这并不影响教程的可阅读性,教程还是非常好的。

zcxsythenew UID.911687
2017-07-17 回复

QuoteAFAN-World 发表于 2017-7-17 20:32 虽然是交互的引子,不过还是想以旁白的身份说一下,这样的设计是违反Windows UI设计原则的。 Toast通知里面 ...
It is just a demo, not real life. 置顶UWP视频的原话,不过我忘记是第几集了,反正是一节习题课。 假如说不合规范,几乎所有的 App.Current.Exit(); 都不合规范。只不过,为了绕过 XAML,我已经不择手段了。

AFAN-World UID.2879093
2017-07-17 使用 Lumia 640 XL 回复

Quotezcxsythenew 发表于 2017-7-17 20:43
It is just a demo, not real life. 置顶UWP视频的原话,不过我忘记是第几集了,反正是一节习题课。 假如说不 ...


{:6_230:}{:6_230:}{:6_230:}{:6_230:}

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报