持有两次Windows Phone 8.1的事件

时间:2015-02-01 15:17:56

标签: c# ui-thread eventhandler messagedialog

我在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

有谁知道如何阻止第二次执行持有事件?

提前致谢!

1 个答案:

答案 0 :(得分:10)

我刚刚发现为什么它不止一次发射。 Hold或SelectionChanged等事件是具有不同状态的事件。就我而言,举办活动有3种状态:开始已完成已取消。不同的州正在进行如下。 当我持有一个元素时,事件的状态是开始,当eventHandler中的整个函数完成时,第二次触发保持事件,状态为已完成< / strong>,如果用户取消该事件,同样的事情。

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());
    }
}