2014-07-07 30 views
1

这是我的设置:我有一个带有大量选项卡的TabControl,并且在最后一个选项卡上,我有一个添加到TabPage的UserControl。此UserControl有一个VisibleChanged事件,该事件应该检查​​它是否可见,以及是否使用CustomCommand()显示某些信息。MessageBox改变了一些看起来不相关的东西

void MyUserControl_VisibleChanged(object sender, EventArgs e) 
     { 
      //MessageBox.Show(""); 
      UserControl us = sender as UserControl; 
      if (us.Visible) 
      { 
       CustomCommand(); 
      } 
      //MessageBox.Show(""); 
     } 

这里的问题是:这个代码,是将错误地认为用户控件是可见的,当它不是,当它不应该给CustomCommand()运行。当注释掉的MessageBox函数在任一位置都未被注释时,UserControl被正确地视为不可见,直到选中TabPage为止。有没有人有任何想法,为什么会这样?

+0

你怎么知道它不可见? CustomCommand是一个长期的操作吗? – LarsTech

+1

“请注意,即使Visible设置为true,如果用户在其他控件背后被遮挡,该控件可能对用户不可见。”来自[MSDN](http://msdn.microsoft.com/en-us/library/system.windows.forms.control.visible(v = vs.110).aspx)。它并不完全解释为什么它可以与消息框一起工作,但它可以解释为什么可见是真实的,即使控件没有显示(即当你的usercontrol的Visible属性被改变时,另一个标签可能正在显示) – derpirscher

回答

1

只是把它放在TabPage上并不能解释这个问题。必须有其他布局事件参与,以使控件实际上可见。 MessageBox.Show()调用提供了时间机器以延迟检查Visible属性。

获取代码稍后运行的标准技术,即MessageBox的工作方式是使用Control.BeginInvoke()方法。委托目标在所有事件被触发并处理并且UI线程再次空闲时运行。像这样:

void MyUserControl_VisibleChanged(object sender, EventArgs e) 
{ 
    UserControl us = sender as UserControl; 
    this.BeginInvoke(new Action(() => { 
     if (us.Visible) 
     { 
      CustomCommand(); 
     } 
    }); 
} 
0

不知道这是否会帮助你,但有一个奇怪的,并且据我所知无证,Visible_Changed事件不对称行为:

  • 它不会引起人们的关注,只要控制变化的Visible属性,或者为真或假。

  • 只要父母的可见性属性更改为true,并且仅为真,它也会得到提升!但我不能通过隐藏另一个控件的控件来提高事件,或者通过MessageBox来隐藏控件。

我不知道你的应用程序如何工作,所以我不能重现。但我确实注意到,实际上,当改变标签时,TabPage上的控件的Visible_Changed事件得到提升,每当页面为选择(但不是当它被选中时)。我也不知道。

您可以尝试通过SelectionIndexChanged或挂钩到TabPage的VisibleChanged事件来捕捉另一个方向。这不是在IDE中可见,但它确实是双向的:

tabPagexyz2.VisibleChanged += tabPagexyz_VisibleChanged; 

void tabPage2_VisibleChanged(object sender, EventArgs e) 
{ 
    // do something 
} 

我看到了有关UI比赛条件是它后面,我怀疑乱撞。这至少可以解释为什么MessageBox会影响。如果你想测试,你可以用一个邪恶的Applictaion.DoEvents代替它。

相关问题