c# - UWP 通知 Toast 已激活、更新和过期
问题描述
我在下面的代码中实现了一个 toast:
public void ShowToast(Music music)
{
var toastContent = new ToastContent()
{
Visual = new ToastVisual()
{
BindingGeneric = new ToastBindingGeneric()
{
Children =
{
new AdaptiveText()
{
Text = string.IsNullOrEmpty(music.Artist) ?
string.IsNullOrEmpty(music.Album) ? music.Name : string.Format("{0} - {1}", music.Name, music.Album) :
string.Format("{0} - {1}", music.Name, string.IsNullOrEmpty(music.Artist) ? music.Album : music.Artist)
},
new AdaptiveProgressBar()
{
Value = new BindableProgressBarValue("MediaControl.Position"),
ValueStringOverride = MusicDurationConverter.ToTime(music.Duration),
Title = "Lyrics To Be Implemented",
Status = MusicDurationConverter.ToTime(MediaControl.Position)
}
}
}
},
Actions = new ToastActionsCustom()
{
Buttons =
{
new ToastButton("Pause", "Pause")
{
ActivationType = ToastActivationType.Background
},
new ToastButton("Next", "Next")
{
ActivationType = ToastActivationType.Background
}
},
},
Launch = "Launch",
Audio = Helper.SlientToast,
};
// Create the toast notification
var toast = new ToastNotification(toastContent.GetXml())
{
ExpirationTime = DateTime.Now.AddSeconds(music.Duration),
};
toast.Activated += Toast_Activated;
Helper.ShowToast(toast);
}
private async void Toast_Activated(ToastNotification sender, object args)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
{
switch ((args as ToastActivatedEventArgs).Arguments)
{
case "Next":
MediaControl.NextMusic();
break;
case "Pause":
PauseMusic();
break;
default:
break;
}
});
}
我想在我的应用程序窗口不可见时发送音乐通知。
我的第一个问题是,暂停和下一步操作将触发一些 UI 更改,这将提高我的应用程序的窗口。但我不希望它被提高。我该怎么办?我怎样才能防止我的吐司在激活时消失(换句话说,点击吐司的任何部分)?
我的第二个问题是,我想将 MediaPlayer 对象的位置绑定到进度条的值,但我的通知 toast 没有更新它的值。如何保持值更新?如何保持状态更新(它是一个需要转换为的字符串)?
我的最后一个问题是,即使我将过期时间设置为 Music.Duration,通常是几分钟,为什么我的 toast 会在几秒钟后消失?
抱歉问了这么多问题。提前致谢!
解决方案
Q1:激活
您应该选择从后台执行任务,这样当您点击按钮时,应用程序不会被激活。具体内容您可以参考此文档。另外,无法防止吐司在您启动时消失点击它。
Q2:更新
可以使用toast.Data来绑定进度,具体步骤可以参考这个文档。
new AdaptiveProgressBar()
{
Value = new BindableProgressBarValue("progressValue"),
ValueStringOverride = new BindableString("progressValueString"),
Status = new BindableString("progressStatus")
}
string tag = "Myplaylist";
string group = "playing";
toast.Tag = tag;
toast.Group = group;
toast.Data = new NotificationData();
toast.Data.Values["progressValue"] = "0.0";
toast.Data.Values["progressValueString"] = "My first song";
toast.Data.Values["progressStatus"] = "Playing...";
toast.Data.SequenceNumber = 0;
当您要更新进度时,请调用以下方法。
public void UpdateProgress()
{
// Construct a NotificationData object;
string tag = "Myplaylist";
string group = "playing";
// Create NotificationData and make sure the sequence number is incremented
// since last update, or assign 0 for updating regardless of order
var data = new NotificationData
{
SequenceNumber = 0
};
data.Values["progressValue"] = "0.7";
data.Values["progressValueString"] = "My first song";
// Update the existing notification's data by using tag/group
ToastNotificationManager.CreateToastNotifier().Update(data, tag, group);
}
Q3:过期
过期时间设置是指消息中心列表清除消息的时间,而不是保留toast的时间。解决方法是:可以设置。toastScenario = ToastScenario.Reminder in toastContent
仍然会出现在屏幕上,直到被点击。
推荐阅读
- html - 元视口打破责任(使一切变得非常小)
- css - CSS 适用于 chrome 开发工具和实时 CSS 编辑器,但不适用于 wordpress 实时站点
- javascript - 测量单页应用程序中的页面加载时间速度
- python - 谁能一步一步解释这个过程
- sql-server - 如何将 12 位数字插入数据库
- python - 句子结构分析
- airflow - 如何在气流中获取 dag 运行的最新执行时间
- reactjs - 如何在 React 中用 Hashtag 替换文本中的单词?
- json - Flutter:显示从服务接收到的嵌套数据:已编辑 #3
- flutter - 如何在另一个组列表(groupby)中实现组列表。是否可以在飞镖自定义对象中使用多个哈希码和 operator==