如何在 Windows Phone 8.1 Runtime App 上 运行 时使用 Toast Notification?
How to use Toast Notification while the app is running on Windows Phone 8.1 Runtime App?
我正在开发预算管理器应用程序。我的应用记录最终用户输入的费用和收入。但我想向该应用程序添加一个功能:用户将能够添加一个定期发生的 income/expense(例如每 10 天一次)。
我认为 ScheduledToastNotification 是解决此问题的方法,因为我希望用户批准创建此事务以完成流程。但问题是,当应用程序 运行(甚至 运行 来自后台)时,当 ToastNotification 显示在屏幕上时,点击它不会像预期的那样工作:启动参数未传递到我的应用程序.我发现这是因为 OnLaunched 事件没有被触发(因为应用程序是 运行)。
另一个问题是我无法确保一切正常,因为我无法调试此类行为:ToastNotification 仅在应用程序不是 运行 时才相关,但我无法调试不是 运行 应用程序。那么我如何才能确切知道当我通过 ToastNotification 启动我的应用程序时会发生什么?
有什么解决方案可以帮助我实现这个目标吗?下面是我的代码:
public static void CreateNotification(Class.Action Transaction)
{
var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
var ToastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
var Strings = ToastXml.GetElementsByTagName("text");
Strings[0].AppendChild(ToastXml.CreateTextNode(loader.GetString("NotificationText")));
Strings[1].AppendChild(ToastXml.CreateTextNode(Transaction.Title + " : " + Transaction.SAmount));
IXmlNode toastNode = ToastXml.SelectSingleNode("/toast");
XmlElement audio = ToastXml.CreateElement("audio");
audio.SetAttribute("src", "ms-winsoundevent:Notification.IM");
toastNode.AppendChild(audio);
((XmlElement)toastNode).SetAttribute("launch", Transaction.Id.ToString());
var Toast = new ScheduledToastNotification(ToastXml, Transaction.NextOccurence);
Toast.Id = Transaction.Id + "";
ToastNotificationManager.CreateToastNotifier().AddToSchedule(Toast);
}
这就是我打算使用参数的方式:
int TransactionID = 0;
if (int.TryParse((string)e.Parameter, out TransactionID))
{
var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
Class.Action RecurentAction = new Class.Action((from act in ActCRUD.GetActions()
where act.Id == TransactionID
select act).FirstOrDefault());
Flyout flyer = new Flyout();
StackPanel content = new StackPanel();
TextBlock editMessage = new TextBlock();
editMessage.FontSize = 20;
editMessage.Margin = new Thickness(15, 50, 15, 15);
TextBox newCategoryName = new TextBox();
newCategoryName.FontSize = 20;
newCategoryName.Margin = new Thickness(15, 15, 15, 15);
Button confirmEdit = new Button();
confirmEdit.Margin = new Thickness(15, 15, 15, 15);
editMessage.Text = loader.GetString("EnterComment");
newCategoryName.PlaceholderText = loader.GetString("EnterCommentPlaceholder");
confirmEdit.Content = loader.GetString("OkText");
confirmEdit.Tapped += new TappedEventHandler(delegate(object o, TappedRoutedEventArgs i)
{
RecurentAction.Comment = newCategoryName.Text;
ActCRUD.AddAction(RecurentAction);
MainPage.CreateNotification((from Class.Action action in ActCRUD.GetActions()
orderby action.Id descending
select action).First());
flyer.Hide();
newCategoryName.Text = "";
});
content.Children.Add(editMessage);
content.Children.Add(newCategoryName);
content.Children.Add(confirmEdit);
flyer.Content = content;
MessageDialog NotificationConfirmation = new MessageDialog(loader.GetString("ConfirmRecurentAction"));
NotificationConfirmation.Commands.Add(new UICommand(loader.GetString("Confirm"), (commands) =>
{
flyer.ShowAt(PivotFintatanana);
}));
NotificationConfirmation.Commands.Add(new UICommand(loader.GetString("DoNotConfirm"), (commands) =>
{
}));
await NotificationConfirmation.ShowAsync();
}
我正在寻找的是一个 ScheduledToastNotification,它会将其参数发送到应用程序,即使这个应用程序是 运行(通过强制它触发 OnLaunched 事件或通过其他解决方法)。
谢谢,
问候。
如果在应用程序 运行 时显示吐司,并且如果您点击吐司,则确实会调用 OnLaunched
函数。但是,Visual Studio 模板提供的 OnLaunched
中的代码会检查 rootFrame
的内容是否为 null
,如果不是(如果您的应用是运行),它只显示 运行 实例。
如果应用程序已经 运行,下面是跳过的代码:
if (rootFrame.Content == null) //shouldn't be null if app is running
{
if (!rootFrame.Navigate(typeof(MainPage), e.Arguments))
{
throw new Exception("Failed to create initial page");
}
}
所以你需要在这部分代码中添加你的逻辑,比如
if(e.Arguments != null)
{
//navigate to details page with e.Arguments
}
else if (rootFrame.Content == null)
{
if (!rootFrame.Navigate(typeof(BlankPage1), e.Arguments))
{
throw new Exception("Failed to create initial page");
}
}
我正在开发预算管理器应用程序。我的应用记录最终用户输入的费用和收入。但我想向该应用程序添加一个功能:用户将能够添加一个定期发生的 income/expense(例如每 10 天一次)。
我认为 ScheduledToastNotification 是解决此问题的方法,因为我希望用户批准创建此事务以完成流程。但问题是,当应用程序 运行(甚至 运行 来自后台)时,当 ToastNotification 显示在屏幕上时,点击它不会像预期的那样工作:启动参数未传递到我的应用程序.我发现这是因为 OnLaunched 事件没有被触发(因为应用程序是 运行)。
另一个问题是我无法确保一切正常,因为我无法调试此类行为:ToastNotification 仅在应用程序不是 运行 时才相关,但我无法调试不是 运行 应用程序。那么我如何才能确切知道当我通过 ToastNotification 启动我的应用程序时会发生什么?
有什么解决方案可以帮助我实现这个目标吗?下面是我的代码:
public static void CreateNotification(Class.Action Transaction)
{
var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
var ToastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
var Strings = ToastXml.GetElementsByTagName("text");
Strings[0].AppendChild(ToastXml.CreateTextNode(loader.GetString("NotificationText")));
Strings[1].AppendChild(ToastXml.CreateTextNode(Transaction.Title + " : " + Transaction.SAmount));
IXmlNode toastNode = ToastXml.SelectSingleNode("/toast");
XmlElement audio = ToastXml.CreateElement("audio");
audio.SetAttribute("src", "ms-winsoundevent:Notification.IM");
toastNode.AppendChild(audio);
((XmlElement)toastNode).SetAttribute("launch", Transaction.Id.ToString());
var Toast = new ScheduledToastNotification(ToastXml, Transaction.NextOccurence);
Toast.Id = Transaction.Id + "";
ToastNotificationManager.CreateToastNotifier().AddToSchedule(Toast);
}
这就是我打算使用参数的方式:
int TransactionID = 0;
if (int.TryParse((string)e.Parameter, out TransactionID))
{
var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
Class.Action RecurentAction = new Class.Action((from act in ActCRUD.GetActions()
where act.Id == TransactionID
select act).FirstOrDefault());
Flyout flyer = new Flyout();
StackPanel content = new StackPanel();
TextBlock editMessage = new TextBlock();
editMessage.FontSize = 20;
editMessage.Margin = new Thickness(15, 50, 15, 15);
TextBox newCategoryName = new TextBox();
newCategoryName.FontSize = 20;
newCategoryName.Margin = new Thickness(15, 15, 15, 15);
Button confirmEdit = new Button();
confirmEdit.Margin = new Thickness(15, 15, 15, 15);
editMessage.Text = loader.GetString("EnterComment");
newCategoryName.PlaceholderText = loader.GetString("EnterCommentPlaceholder");
confirmEdit.Content = loader.GetString("OkText");
confirmEdit.Tapped += new TappedEventHandler(delegate(object o, TappedRoutedEventArgs i)
{
RecurentAction.Comment = newCategoryName.Text;
ActCRUD.AddAction(RecurentAction);
MainPage.CreateNotification((from Class.Action action in ActCRUD.GetActions()
orderby action.Id descending
select action).First());
flyer.Hide();
newCategoryName.Text = "";
});
content.Children.Add(editMessage);
content.Children.Add(newCategoryName);
content.Children.Add(confirmEdit);
flyer.Content = content;
MessageDialog NotificationConfirmation = new MessageDialog(loader.GetString("ConfirmRecurentAction"));
NotificationConfirmation.Commands.Add(new UICommand(loader.GetString("Confirm"), (commands) =>
{
flyer.ShowAt(PivotFintatanana);
}));
NotificationConfirmation.Commands.Add(new UICommand(loader.GetString("DoNotConfirm"), (commands) =>
{
}));
await NotificationConfirmation.ShowAsync();
}
我正在寻找的是一个 ScheduledToastNotification,它会将其参数发送到应用程序,即使这个应用程序是 运行(通过强制它触发 OnLaunched 事件或通过其他解决方法)。
谢谢, 问候。
如果在应用程序 运行 时显示吐司,并且如果您点击吐司,则确实会调用 OnLaunched
函数。但是,Visual Studio 模板提供的 OnLaunched
中的代码会检查 rootFrame
的内容是否为 null
,如果不是(如果您的应用是运行),它只显示 运行 实例。
如果应用程序已经 运行,下面是跳过的代码:
if (rootFrame.Content == null) //shouldn't be null if app is running
{
if (!rootFrame.Navigate(typeof(MainPage), e.Arguments))
{
throw new Exception("Failed to create initial page");
}
}
所以你需要在这部分代码中添加你的逻辑,比如
if(e.Arguments != null)
{
//navigate to details page with e.Arguments
}
else if (rootFrame.Content == null)
{
if (!rootFrame.Navigate(typeof(BlankPage1), e.Arguments))
{
throw new Exception("Failed to create initial page");
}
}