在我的WPF计划中,我需要为飞行模拟软件设置飞机故障。例如,如果我点击" Fire Engine 1" MainWindow上的按钮,
private DispatcherTimer DT;
private void button_Engine_1_On_Fire(object sender, RoutedEventArgs e)
{
SettingFailureCondition("Fire engine 1");
}
然后弹出窗口实例" ftc"将显示供用户设置触发失败的条件
private void SettingFailureCondition(string failure_name)
{
FailureTriggerCondition ftc = new FailureTriggerCondition();
...
if (ftc.ShowDialog() == true)
{
if(altitude>input)//if the altitude in the software higher than user's input
{
DT.Tick += new EventHandler((sender, e)=>MoveFailureByFlag(failure_name, flag));
DT.Interval = new TimeSpan(0, 0, 0, 1);
DT.Start();
DT.Tick -= new EventHandler((sender, e)=>MoveFailureByFlag(failure_name, flag));//Why can't this unsubscribe the event?
}
}
}
至于上面的代码,我需要每秒检测一次海拔是否符合要求。 但是一旦满足,请执行MoveFailureByFlag
并停止检测。如何操作?
if(altitude>input)//once this is met, execute function MoveFailureByFlag then stop detecting it
我正在考虑取消订阅活动,但在这种情况下无法找到方法。 以下失败但我不知道为什么。
DT.Tick -= new EventHandler((sender, e)=>MoveFailureByFlag(failure_name, flag));//Why can't this unsubscribe the event?
感谢您的帮助。
答案 0 :(得分:0)
让我先回答你的一般问题:
DT.Tick += new EventHandler((sender, e)=>MoveFailureByFlag(failure_name, flag));
...
DT.Tick -= new EventHandler((sender, e)=>MoveFailureByFlag(failure_name, flag));//Why can't this unsubscribe the event?
这些不对应,因为它们是两个不同的事件处理程序(请注意new
关键字)。
但是,您可以将事件处理程序保存在变量中,并使用它来取消订阅:
EventHandler myHandler = new EventHandler((sender, e)=>MoveFailureByFlag(failure_name, flag));
DT.Tick += myHandler;
...
DT.Tick -= myHandler;
但是,在您的特定代码示例中,您将在事件发生之前删除事件处理程序,因此根本不会发生任何事件。
如果您想在第一次发生事件后删除处理程序,则可以使用“自动删除”事件处理程序:
EventHandler myHandler;
myHandler = new EventHandler((sender, e) =>
{
MoveFailureByFlag(failure_name, flag);
DT.Tick -= myHandler;
});
DT.Tick += myHandler;
DT.Interval = ...;
DT.Start();