【万里征程——Windows App开发】使用Toast通知
前面我们使用了 MessageDialog来作为弹窗,这里来介绍一个更加高大上的Toast通知。
Toast通知本质上动力是由XML来提供的,一开始我还不相信不知道XML原来有这么大的威力。现在就来看看和Toast相关的知识。
1)实例化ToastNotification类。
ToastNotification toast1 = new ToastNotification(xdoc);
2)使用ToastNotificationManager来管理Toast通知,包括添加、展示、移除、获取通知等等。
ToastNotificationManager.CreateToastNotifier().Show(toast1);
3)在第一步中的xdoc就是一段XML数据,它从何而来呢?
XmlDocument xdoc = new XmlDocument();
4)上一步代码实例化了一个XML,但是它没有数据呀,数据从哪来呢?
xdoc.LoadXml(txtXML.Text);
5)这段代码就将一段Text导入了XML中。而Text数据有很多种获取方式。在下文中自然会提到。
Toast的XML模板有许多,我们可以直接来获取它们。用枚举和强大的var即可。
var items = Enum.GetNames(typeof(ToastTemplateType));
那么就正式开工了,因为重复的属性太多了我就大概设置了2个Style资源。
<Page.Resources><Style TargetType="TextBlock" x:Key="StyleHeaderTextBlock"><Setter Property="FontSize" Value="40"/><Setter Property="FontFamily" Value="华文琥珀"/><Setter Property="Foreground" Value="HotPink"/><Setter Property="Margin" Value="12"/></Style><Style TargetType="Button" x:Key="StyleToastButton"><Setter Property="Width" Value="180"/><Setter Property="Height" Value="50"/><Setter Property="Background" Value="Aqua"/><Setter Property="FontSize" Value="21"/><Setter Property="Margin" Value="12"/><Setter Property="Content" Value="显示Toast通知" /></Style></Page.Resources>
下面是第一部分用于生成Toast通知。
<StackPanel Orientation="Vertical" Grid.Column="0" Margin="12"><TextBlock Text="生成Toast通知" Style="{StaticResource StyleHeaderTextBlock}"/><StackPanel Orientation="Horizontal" HorizontalAlignment="Left"><TextBlock FontSize="24" Foreground="Wheat" Text="请选择一个模板:" VerticalAlignment="Center"/><ComboBox Name="comboBoxToast" Foreground="Green" Width="275" SelectionChanged="comboBoxToast_SelectionChanged"/></StackPanel><TextBox Foreground="Green" x:Name="txtXML" HorizontalAlignment="Left" Width="500" Height="400" Header="模板XML:" TextWrapping="Wrap" FontSize="24"/><Button Name="btnShowToast1" Click="btnShowToast1_Click" Style="{StaticResource StyleToastButton}"/></StackPanel>
后台代码也蛮容易的,利用上面讲的就好了。
public MainPage(){this.InitializeComponent(); var items = Enum.GetNames(typeof(ToastTemplateType));this.comboBoxToast.ItemsSource = items;}private void comboBoxToast_SelectionChanged(object sender, SelectionChangedEventArgs e){string tempt = ((ComboBox)sender).SelectedItem as string;if (!string.IsNullOrEmpty(tempt)){ ToastTemplateType template = (ToastTemplateType)Enum.Parse(typeof(ToastTemplateType), tempt);XmlDocument xdoc = ToastNotificationManager.GetTemplateContent(template);txtXML.Text = xdoc.GetXml();}}private void btnShowToast1_Click(object sender, RoutedEventArgs e){if (txtXML.Text == "") return; XmlDocument xdoc = new XmlDocument();xdoc.LoadXml(txtXML.Text); ToastNotification toast1 = new ToastNotification(xdoc); ToastNotificationManager.CreateToastNotifier().Show(toast1); }
模板是这样用的……
在src中填入图片的路径也可以在Toast中显示图像哦,赶紧试试吧……
接下来是第二段啦,和前面的很是类似……
<StackPanel Orientation="Vertical" Grid.Column="1"><TextBlock Text="更改Toast通知的提示音" Style="{StaticResource StyleHeaderTextBlock}"/><TextBlock Margin="12" Text="请输入Toast消息内容:" FontSize="24"/><TextBox Margin="12" Height="50" x:Name="txtMesaage"/><TextBlock Margin="12" FontSize="24" Text="请选择一种提示声音:"/><ComboBox Margin="12" Height="50" x:Name="comboBoxAudio" Width="400" HorizontalAlignment="Left"><ComboBoxItem IsSelected="True">ms-winsoundevent:Notification.Default</ComboBoxItem><ComboBoxItem>ms-winsoundevent:Notification.IM</ComboBoxItem><ComboBoxItem>ms-winsoundevent:Notification.Mail</ComboBoxItem><ComboBoxItem>ms-winsoundevent:Notification.Reminder</ComboBoxItem><ComboBoxItem>ms-winsoundevent:Notification.Looping.Alarm</ComboBoxItem><ComboBoxItem>ms-winsoundevent:Notification.Looping.Call</ComboBoxItem></ComboBox><StackPanel Orientation="Horizontal"><CheckBox x:Name="checkBoxLoop" Margin="12" Content="循环播放"/><CheckBox x:Name="checkBoxSilent" Margin="12" Content="静音"/></StackPanel> <Button Name="btnShowToast2" Click="btnShowToast2_Click" Style="{StaticResource StyleToastButton}"/></StackPanel>
上面代码中的“ms-winsoundevent:Notification.Default”都是填到src中的用于设置声音,还可以在loop、silent中设置是否循环以及是否静音,那到底该怎么用呢?应该将这些属性全部都填入到XML中。
xmlContent = string.Format("<toast duration='{0}'>" +"<visual>" +"<binding template='ToastText01'>" +"<text id='1'>{1}</text>" +"</binding>" +"</visual>" +"<audio src='{2}' loop='{3}' silent='{4}'/>" +"</toast>",toastDuration, msg, audioSrc, isLoop, isSilent
);
上面用的xmlContent也要先定义出来,一开始设置为Empty就好。
string xmlContent = string.Empty;
isLoop和isSilent属性都可以借助于三目运算符在CheckBox中获取来。
string isLoop = checkBoxLoop.IsChecked == true ? "true" : "false";
string audioSrc = (comboBoxAudio.SelectedItem as ComboBoxItem).Content.ToString();
string toastDuration = checkBoxLoop.IsChecked == true ? "long" : "short";
string isSilent = checkBoxSilent.IsChecked == true ? "true" : "false";
当然,考虑得更加周到些,用户可以在还没有输入通知内容就点了显示Toast通知按钮,对此用三目运算符也是极好的选择。
string msg = txtMesaage.Text == "" ? "你还没有输入Toast通知的内容呢……" : txtMesaage.Text;
这些准备工作都写好了以后呢就该设置Toast通知了,和上面的Toast1类似哦,大家试试。
可是这些通知都没有时间性可言,因为有时候我们需要定在一个时间来执行Toast通知。这自然也是可以实现的。
先作如下界面设计。
<StackPanel Orientation="Vertical" Grid.Column="2"><TextBlock Text="计划时间显示Toast通知" Style="{StaticResource StyleHeaderTextBlock}"/> <StackPanel Orientation="Horizontal" Height="60"><TextBlock FontSize="28" Text="计划在" VerticalAlignment="Center"/><TextBox Name="tBoxTime" FontSize="28" Width="60" Height="45" VerticalAlignment="Center"/><TextBlock FontSize="28" Text="秒后显示Toast通知" VerticalAlignment="Center"/></StackPanel> <Button Name="btnShowToast3" Click="btnShowToast3_Click" Style="{StaticResource StyleToastButton}"/></StackPanel>
后台代码如下。
private async void btnShowToast3_Click(object sender, RoutedEventArgs e){int toastTime;try{ toastTime = int.Parse(tBoxTime.Text.ToString());XmlDocument xdoc = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText01); var txtnodes = xdoc.GetElementsByTagName("text"); txtnodes[0].InnerText = "你好,这是一条定时为"+toastTime.ToString()+ "秒的Toast消息。"; ScheduledToastNotification toast3 = new ScheduledToastNotification(xdoc, DateTimeOffset.Now.AddSeconds(toastTime)); ToastNotificationManager.CreateToastNotifier().AddToSchedule(toast3);}catch (Exception ex){ Windows.UI.Popups.MessageDialog messageDialog = new Windows.UI.Popups.MessageDialog(ex.Message);await messageDialog.ShowAsync();} }
在这个小程序中因为侧重于讲解定时而非Toast的通知样式,因此就选用了比较简单的ToastText01模板。而后找出Text节点,并向该节点写入内容。最后就是创建Toast通知了。
ScheduledToastNotification toast3 = new ScheduledToastNotification(xdoc, DateTimeOffset.Now.AddSeconds(toastTime));
同样为了防止用户没有在TextBox中输入时间或输入了错误格式的时间比如“5秒”而做了try、catch异常检测。当然了,在实际产品中,这里可就要做得更加完美了,时间用TextBox来输入并不是一件好事,而应用我们前面介绍的TimePicker。
给这3段程序来张全家福吧~
相关源码我已经上传,不需要积分。
传送门:Toast通知源码
感谢您的访问,希望对您有所帮助。 欢迎大家关注、收藏以及评论。
我的更多博客文章:NoMasp博客导读
为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp
【万里征程——Windows App开发】使用Toast通知相关推荐
- 【万里征程——Windows App开发】应用栏
基本的用法我们在 [万里征程--Windows App开发]页面布局和基本导航中已经讲过了,这里继续补充关于应用栏的更多用法. Icon 在之前的学习中,我们知道Icon属性中有很多很多系统预定义,但 ...
- 【万里征程——Windows App开发】SemanticZoom视图切换
相信用过Windows Phone或者Windows 8/8.1/10的朋友对下面这张截图肯定不陌生.这就是通过SemanticZoom来实现的,当数据过多时,这种控件尤其适用.它有一个放大视图Zoo ...
- 【万里征程——Windows App开发】开发准备
操作系统及SDK 操作系统 如果打算开发Windows App,那么你的电脑就不能再用老旧的Windows 7了.推荐使用Windows 8.1.写这篇博客的时候,我用的操作系统是Windows 10 ...
- 【万里征程——Windows App开发】动态磁贴
动态磁贴是什么,相信大家用了这么久的Windows 8/8.1/10早就非常了解了吧. 像什么小磁贴.中磁贴.宽磁贴.大磁贴,还有这里的应用商店Logo等,大家在下面根据不同的分辨率选择合适的图片就好 ...
- 【万里征程——Windows App开发】数据绑定——简单示例、更改通知、数据转换...
简单的数据绑定示例 相比于理论,我更倾向于从实践中开始博客,尤其是对于数据绑定.那么,我们先来看看几个简单的例子. 1.数据绑定到TextBox 我们依旧使用前面的闹钟类来开始.在下面的代码中,我们有 ...
- 【万里征程——Windows App开发】DatePickerFlyout、TimePickerFlyout的使用
已经有挺长时间没有更新这个专栏了,不过刚才有网友私信问我一个问题现在就火速更新上一篇~ 这一篇讲解在WP上DataPickerFlyout和TimePickerFlyout的使用,但它们只能在WP上跑 ...
- 【万里征程——Windows App开发】DatePickerTimepicker
在前面我们走马观花地介绍了一大堆控件,其中自然也包括这DatePicker和TimePicker,那么稍微高级些的用法呢? 如果你想做一个关于健身.闹钟等的App,那么不可避免的会用到时间这些控件了. ...
- 【万里征程——Windows App开发】文件数据——文件选取器
使用文件选取器保存文件 就我个人而言,还是非常喜欢使用文件选取器的,因为能够用自己的代码来调用系统的各种弹框. 在这个示例中,首先在XAML中添加一个Button和一个TextBlock,分别命名为b ...
- 【万里征程——Windows App开发】控件大集合1
添加控件的方式有多种,大家更喜欢哪一种呢? 1)使用诸如 Blend for Visual Studio 或 Microsoft Visual Studio XAML 设计器的设计工具. 2)在 Vi ...
最新文章
- LeetCode简单题之最小操作次数使数组元素相等
- .NET Core剪裁器升级瘦身引擎,并支持剪裁计划的录制和回放
- head first python(第三章)–学习笔记
- Spring MVC 响应数据、作用域对象
- Qt总结之一:遍历文件夹和文件目录,并过滤和获取文件信息、后缀名、前缀名(一)
- itunes备份包括哪些内容_软件开发项目技术方案包括哪些内容
- JAVA使用465端口与25端口实现发送邮件的业务,以及执行时常见的错误解决方法
- 从零开始学习CANoe(四)—— 设计panel
- 10套精美而实用的CSS3按钮
- Caused by: org.elasticsearch.action.search.SearchPhaseExecutionException报错解决
- ArcGIS 制作3D遥感影像图
- 学生信息管理系统(头哥适用版)(c语言)
- 计算机455端口,455端口怎么关闭-455端口关闭的方法 - 河东软件园
- 多人共享的待办事项app有哪些
- DEBUG:惠普打印机页边距总是不对
- 15 个常用的python 开源框架
- 51nod 13831048 整数分解为2的幂 [递推]【数学】
- 基于Python的百度AI人脸识别API接口(可用于OpenCV-Python人脸识别)
- 时光荏苒,白驹过隙。2018年总结!
- 博士申请 | 香港理工大学招收机器学习全奖博士生/博士后/研究助理
热门文章
- 计算机专业英语辅导教材,计算机专业英语2全套教材.ppt
- geany执行python闪退_说说如何使用 Geany 编译与执行 Python
- Mysql经典面试题(建议收藏)
- JavaScript一些优雅小技巧不得不知
- qq复读机java脚本分享蓝奏云_蓝奏云资源,各种软件分享链接,干货
- https://imgsa.baidu.com/forum/pic/item/...【贴吧图床】
- 汽车matlab小论文,基于matlab汽车道路模型研究论文
- 破解mariadb数据库密码
- 四天搞懂生成对抗网络(二)——风格迁移的“精神始祖”Conditional GAN
- MATLAB Robotics Toolbox常用函数简介