2017-04-25 2 views
0

J'ai un gestionnaire pour Closing événement d'un onglet, il montre un message de confirmation de fermeture. si l'utilisateur choisir Pas, je mets e.Handled = true; mais s'il choisit Oui près, je supprimer l'onglet de la liste des onglets et faire d'autres choses, lorsque la méthode arrive à sa fin, il obtient alors appelé à nouveau, montrant la même message, j'ai essayé de mettre e.Handled = true; à la fin de la méthode mais l'onglet ne se ferme pas.Comment empêcher le double appel de l'événement Closing sans utiliser e.Handled = true?

void oTab_TabClosing(object sender, RoutedEventArgs e) 
{ 
    var close = MainClass.ShowMessage(ResCommon.MsgConfirmClose, ResCommon.ttlClose, MainClass.MessageButtons.YesNO); 
    if (!close) 
    { 
     e.Handled = true; 
     return; 
    } 
    FabTab.FabTabItem oTabItem = (FabTab.FabTabItem)sender; 
    if (HtOpenTabs.ContainsKey(oTabItem.Name)) HtOpenTabs.Remove(oTabItem.Name); 
    oTabItem = null; 

    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
} 

Cette méthode abonnez-vous à l'événement:

public void AddToTab(object formToOpen, string formTitle) 
{ 
    string formName = ((UserControl)formToOpen).Name; 
    if (HtOpenTabs.ContainsKey(formName)) 
    { 
     // By Yousef Mohamed (12-10-2014) - Activate opened tab // 
     foreach (FabTabItem item in ((FabTabControl)this.tabControl).Items) 
     { 
      if (item.Name == formName) 
      { 
       ((FabTabControl)this.tabControl).SelectedItem = item; 
       return; 
      } 
     } 
    } 

    var oTab = new FabTabItem { Content = formToOpen }; 
    oTab.Name = formName; 
    oTab.TabClosing += oTab_TabClosing; 

    oTab.Header = formTitle; 
    BrushConverter bc = new BrushConverter(); 
    Brush brush = (Brush)bc.ConvertFrom("#FFF0F8FF"); 
    brush.Freeze(); 
    oTab.Background = brush; 
    oTab.Height = 30; 
    tabControl.Items.Add(oTab); 
    tabControl.SelectedIndex = tabControl.Items.Count - 1; 
    HtOpenTabs.Add(formName, oTab); 
} 
+1

Comment avez-vous affecté ce gestionnaire d'événement? Vous avez probablement utilisé '+ =' et je soupçonne que l'endroit où vous avez placé la tâche a été appelé deux fois – Andrei

+0

Il se trouve dans trois signatures de la méthode 'AddToTab', juste l'un d'entre eux est appelé –

+0

pouvez-vous le montrer? – Andrei

Répondre

0

Il semble que le deuxième événement est déclenché dans le HtOpenTabs.Remove(oTabItem.Name);

Essayez de vous désabonner ce gestionnaire d'événements avant de retirer votre onglet.

+0

Ceci est la méthode 'Hashtable.Remove' –