如何在不使用e.Handled = true的情况下防止两次调用关闭事件?
问题描述:
我有一个处理程序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);
}
答
看来,第二个事件是在HtOpenTabs.Remove(oTabItem.Name);
尝试删除你的标签之前,取消此事件处理程序被解雇。
+0
这是'Hashtable.Remove'方法 –
你是如何分配这个事件处理程序的?你可能使用了'+ =',我怀疑你把这个任务的位置调用了两次 – Andrei
它位于'AddToTab'方法的三个签名中,只有其中一个被调用 –
可以显示它吗? – Andrei