C# 如何使用“停止无限调用”+;=(o,e)=>&引用;在c中#

C# 如何使用“停止无限调用”+;=(o,e)=>&引用;在c中#,c#,.net,silverlight,silverlight-5.0,C#,.net,Silverlight,Silverlight 5.0,我正在使用TabItem的GetFocus函数。我有不同的选项卡项,当我在其他选项卡项之间切换时,它必须弹出一个消息框。我使用以下代码执行此操作: TabItem tbi = new TabItem(); tbi.GotFocus += (o, e) => { MessageBox.Show("it pop ups infinitely"); }; 如何解决这个问题。是否有可能它弹出一次,然后控制退出此功能

我正在使用TabItem的GetFocus函数。我有不同的选项卡项,当我在其他选项卡项之间切换时,它必须弹出一个消息框。我使用以下代码执行此操作:

       TabItem tbi = new TabItem();
       tbi.GotFocus += (o, e) => 
         {
          MessageBox.Show("it pop ups infinitely");
       };

如何解决这个问题。是否有可能它弹出一次,然后控制退出此功能?我的意思是类似于。弹出消息框下方的“-=(o,e)”。(我猜它会无限地弹出,因为当我打开TabItem时,它会持续打开,并不断弹出)。(请不要建议改为LostFocus)

那么您希望在第一次调用处理程序时立即将其删除吗

RoutedEventHandler handler = null;
handler = (o, e) => 
       {
          MessageBox.Show("it pop ups infinitely");
          tbi.GotFocus -= handler;
       };

tbi.GotFocus += handler;

因此,您希望在第一次调用处理程序时立即将其删除

RoutedEventHandler handler = null;
handler = (o, e) => 
       {
          MessageBox.Show("it pop ups infinitely");
          tbi.GotFocus -= handler;
       };

tbi.GotFocus += handler;

这是有道理的,因为MessageBox获得焦点,当您关闭它时,TabItem再次获得焦点。也许一个简单的布尔标志可以解决这个问题

   bool focusing = false;
   TabItem tbi = new TabItem();
   tbi.GotFocus += (o, e) =>
   {
      if (focusing) {
          focusing = false;
          return;
      }
      focusing = true;
      MessageBox.Show("it pop ups infinitely");
   };

这是有道理的,因为MessageBox获得焦点,当您关闭它时,TabItem再次获得焦点。也许一个简单的布尔标志可以解决这个问题

   bool focusing = false;
   TabItem tbi = new TabItem();
   tbi.GotFocus += (o, e) =>
   {
      if (focusing) {
          focusing = false;
          return;
      }
      focusing = true;
      MessageBox.Show("it pop ups infinitely");
   };

嗯,警报会将焦点从选项卡项移开,当您解除它时,它会将焦点返回到再次触发事件的选项卡。你到底想在这里干什么?@MattBurland我的无限呼叫是对的吗@(我猜它会无限地弹出,因为当我打开TabItem时,它会持续打开并不断弹出)。不,我刚刚解释了为什么它会不断弹出。每次解除警报时,都会再次触发事件。我不知道你所说的“它持续打开”是什么意思。嗯,一个警报会使焦点从选项卡项移开,当你关闭它时,它会将焦点返回到触发事件的选项卡。你到底想在这里干什么?@MattBurland我的无限呼叫是对的吗@(我猜它会无限地弹出,因为当我打开TabItem时,它会持续打开并不断弹出)。不,我刚刚解释了为什么它会不断弹出。每次解除警报时,都会再次触发事件。我不知道你说的“它一直开着”是什么意思。