2017-04-25 23 views
0

我有一个处理程序Closing事件的选项卡,它显示确认关闭消息。 如果用户选择没有,我设置e.Handled = true;,但如果他选择接近,我从标签列表中删除选项卡,并做其他的东西, 当方法达到目的,然后再次调用,显示同样的消息,我试图在方法的末尾设置e.Handled = true;,但该选项卡未关闭。如何在不使用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(); 
} 

这种方法订阅事件:

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

你是如何分配这个事件处理程序的?你可能使用了'+ =',我怀疑你把这个任务的位置调用了两次 – Andrei

+0

它位于'AddToTab'方法的三个签名中,只有其中一个被调用 –

+0

可以显示它吗? – Andrei

回答

0

看来,第二个事件是在HtOpenTabs.Remove(oTabItem.Name);

尝试删除你的标签之前,取消此事件处理程序被解雇。

+0

这是'Hashtable.Remove'方法 –

相关问题