作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 ListBoxItem
上有一个持有事件。所以当我拿着一个元素时,它会直接进入函数,但它会显示为被触发了两次。
private async void OutersAndContactInTel_Holding(object sender, HoldingRoutedEventArgs e)
{
try
{
FrameworkElement element = (FrameworkElement)e.OriginalSource;
if (element.DataContext != null && element.DataContext is Contact)
{
Contact selectedContact = (ImOutContact)element.DataContext;
if (selectedContact.IsOuter)
{
MessageDialog msgToAddContact = new MessageDialog("Voulez-vous vraiment suivre " + selectedContact.Pseudo + " ?");
msgToAddContact.Commands.Add(new UICommand("Oui", (UICommandInvokedHandler) =>
{
AddContactProcess(selectedContact);
}));
msgToAddContact.Commands.Add(new UICommand("Non"));
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => msgToAddContact.ShowAsync());
}
else
{
MessageDialog msgToInviteContact = new MessageDialog("Envoyez une invitation à l'utilisation de l'application par sms à " + selectedContact.NomPrenom + " ?");
msgToInviteContact.Commands.Add(new UICommand("Oui", (UICommandInvokedHandler) =>
{
SendSmsToInvite(selectedContact);
}));
msgToInviteContact.Commands.Add(new UICommand("Non"));
await msgToInviteContact.ShowAsync();
}
}
}
catch (Exception ex)
{
MessageDialog errorMessage = new MessageDialog(CustomDialogMessage.getMessageContent(CustomDialogMessage.ERROR_MESSAGE));
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => errorMessage.ShowAsync());
}
}
当我在该函数的末尾显示一个 MessageDialog
msgToAddContact 时,它被触发了两次,这使得 MessageDialog
也显示了两次。
如果第一个 MessageBox.showAsync
没有完成,它会崩溃,因为不可能同时显示多个 MessageDialog
。
有谁知道如何阻止持有事件的第二次执行?
提前致谢!
最佳答案
我刚刚发现为什么它会触发不止一次。 Holding 或 SelectionChanged 等事件是具有不同状态的事件。就我而言,举办事件有 3 种状态:开始、完成、已取消。不同的状态如下进行。当我持有一个元素一次时,事件的状态是开始,当 eventHandler 中的整个函数完成时,持有事件第二次被触发,状态为完成,如果用户取消事件也是一样。
Msft 在这里解释得很好:EventHandler
为避免在每个状态都执行相同的代码,只需在关键代码的开头添加一个条件,该条件只执行一次。
我的代码实际上是这样的,您可以将其与我的第一篇文章进行比较:
private async void OutersAndContactInTel_Holding(object sender, HoldingRoutedEventArgs e)
{
try
{
FrameworkElement element = (FrameworkElement)e.OriginalSource;
if (element.DataContext != null && element.DataContext is Contact && e.HoldingState == Windows.UI.Input.HoldingState.Started)
{
Contact selectedContact = (ImOutContact)element.DataContext;
if (selectedContact.IsOuter)
{
MessageDialog msgToAddContact = new MessageDialog("Voulez-vous vraiment suivre " + selectedContact.Pseudo + " ?");
msgToAddContact.Commands.Add(new UICommand("Oui", (UICommandInvokedHandler) =>
{
AddContactProcess(selectedContact);
}));
msgToAddContact.Commands.Add(new UICommand("Non"));
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => msgToAddContact.ShowAsync());
}
else
{
MessageDialog msgToInviteContact = new MessageDialog("Envoyez une invitation à l'utilisation de l'application par sms à " + selectedContact.NomPrenom + " ?");
msgToInviteContact.Commands.Add(new UICommand("Oui", (UICommandInvokedHandler) =>
{
SendSmsToInvite(selectedContact);
}));
msgToInviteContact.Commands.Add(new UICommand("Non"));
await msgToInviteContact.ShowAsync();
}
}
}
catch (Exception ex)
{
MessageDialog errorMessage = new MessageDialog(CustomDialogMessage.getMessageContent(CustomDialogMessage.ERROR_MESSAGE));
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => errorMessage.ShowAsync());
}
}
关于c# - 举行事件触发了两次Windows Phone 8.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28264260/
我是一名优秀的程序员,十分优秀!