博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows App开发之使用通知与动态磁贴
阅读量:5905 次
发布时间:2019-06-19

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

使用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资源。

下面是第一部分用于生成Toast通知。

后台代码也蛮容易的,利用上面讲的就好了。

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中显示图像哦,赶紧试试吧……

接下来是第二段啦,和前面的很是类似……

ms-winsoundevent:Notification.Default
ms-winsoundevent:Notification.IM
ms-winsoundevent:Notification.Mail
ms-winsoundevent:Notification.Reminder
ms-winsoundevent:Notification.Looping.Alarm
ms-winsoundevent:Notification.Looping.Call

上面代码中的“ms-winsoundevent:Notification.Default”都是填到src中的用于设置声音,还可以在loop、silent中设置是否循环以及是否静音,那到底该怎么用呢?应该将这些属性全部都填入到XML中。

xmlContent = string.Format(     "
" + "
" + "
" + "
{1}
" + "
" + "
" + "
" + "
", 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通知。这自然也是可以实现的。

先作如下界面设计。

后台代码如下。

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段程序来张全家福吧~

这里写图片描述

使用动态磁贴示例

动态磁贴是什么,相信大家用了这么久的Windows 8/8.1/10早就非常了解了吧。

像什么小磁贴、中磁贴、宽磁贴、大磁贴,还有这里的应用商店Logo等,大家在下面根据不同的分辨率选择合适的图片就好啦。

这里写图片描述

下面来做一个更新磁贴页面的功能,这是页面XML部分。

在后台代码的Main函数中,获取TileTemplateType枚举并绑定到ComboBox上。

var itemsTile = Enum.GetNames(typeof(TileTemplateType));this.comboBoxTile.ItemsSource = itemsTile;

下面的代码和前面的Toast真的非常类似,所以我才把这两节连在一起来写了。Button按钮的Click事件中,和之前一样建一个XML,然后加载到TileNotification类的实例中。最后就是TileUpdateManager类,也就是磁贴更新。

private void btnTile_Click(object sender, RoutedEventArgs e){    if (this.textBoxXML.Text == "")          return;    XmlDocument xdoc = new XmlDocument();    xdoc.LoadXml(this.textBoxXML.Text);    TileNotification tileNotifi = new TileNotification(xdoc);    TileUpdateManager.CreateTileUpdaterForApplication().Update(tileNotifi);}private void comboBoxTile_SelectionChanged(object sender, SelectionChangedEventArgs e){    TileTemplateType tileTemplate = (TileTemplateType)Enum.Parse(typeof(TileTemplateType),        this.comboBoxTile.SelectedItem as string);    XmlDocument xdoc = TileUpdateManager.GetTemplateContent(tileTemplate);    this.textBoxXML.Text = xdoc.GetXml();}

当然了,如果你的APP不满足于一个磁贴,你也可以创建第二个磁贴哟!

依旧和Toast通知的XML类似,它也有好多属性的……

Arguments:使用该字符串参数在通过次要磁贴启动应用程序时会传递给Application类的OnLaunched方法,这样一来应用程序就可以根据传入的参数来执行特定的操作。

BackgroundColor:设置磁贴的背景色。

DisplayName和ShortName:设置显示在磁贴上的文本。

Logo等:设置磁贴的图标,用Uri。

ForegroundText:磁贴上文本的颜色,可用的选项有深色、浅色等。

TileID:设置磁贴的唯一标识ID,创建新磁贴前用SecondaryTile.Exists判断是否已经存在。

在添加第二磁贴的Button的Click事件中:

private async void btnCreateTile(object sender, RoutedEventArgs e){    if(SecondaryTile.Exists(textTileID.Text))    {        textBlockMsg.Text="该ID磁贴已经存在";        return ;    }    Uri uriImg=new Uri("ms-appx:///Assests/uriImg.png");    ……    ……    // 创建第二磁贴    SecondaryTile secTile=new SecondaryTile();    this.Tag=secTile;    secTile.DisplayName=textBlockDisplayName.Text;    secTile.TileID=textBlockID.Text;    secTile.Arguments="second"; // 在后面有用到    // 设置图标    secTile.VisualElements.BackgroundColor=Windows.UI.Colors.Gold;    ……    ……    bool r=await secTile.RequestCreateAsync();    textBlockMsg.Text=r == true ?"磁贴创建成功啦.":"磁贴创建失败了哎.";  // 返回测试结果

如果希望点击第二磁贴导航到特定的页面,就需要重写该页面的OnNavigatedTo方法。

preteced async override void OnNavigatedTo(NavigationEventArgs e){    if(e.Parameter is Windows.ApplicationModel.Activation.LaunchActivatedEventArgs)    {        var arg=e.Parameter as Windows.ApplicationModel.Activation.LaunchActivateEventArgs;        ……    }}if(rootFrame.Content==null){    if(e.Arguments=="second")        rootFrame.Navigate(typeof(OtherPage),e);    else        rootFrame.Navigate(typeof(MainPage));}

这里的参数”second”就是上面设置那个Arguments哦,它的作用就在于这里呢。

版权声明:本文为 NoMasp柯于旺 原创文章,如需转载请联系本人。

转载于:https://www.cnblogs.com/NoMasp/p/4785978.html

你可能感兴趣的文章
Oracle 字符集的查看和修改【上】
查看>>
tomcat注册windows服务
查看>>
使用qq邮箱的smpt服务发送邮件一定要记得用ssl
查看>>
20个非常有用的Java代码片段
查看>>
转 ubuntu解压命令全览
查看>>
Android开发的前景分析——之你为何看好Android?
查看>>
linux学习笔记
查看>>
页面自动刷新
查看>>
No free lunch in search and optimization
查看>>
分析 Spring 的编程式事务管理及声明式事务管理(转)
查看>>
网站优化和竞价有什么区别
查看>>
MySQL开源热备工具XtraBackup的原理与程序说明
查看>>
mongoDB(1):windows下安装mongoDB(解压缩版)
查看>>
CentOS修改主机名
查看>>
php 5.3.6中php-fpm 配置
查看>>
XMPP协议分析-原理篇
查看>>
centos7常用操作
查看>>
系统集成资质培训 - 新书发布
查看>>
Ubuntu解决RTNETLINK answers: File exists
查看>>
ES6数组去重的最佳实践:Set结合Array.from() | 拓展运算符结合 Set
查看>>