这是我的设置:我有一个带有多个标签的TabControl,在最后一个标签上,我有一个添加到TabPage的UserControl。此UserControl有一个VisibleChanged
事件,用于检查它是否可见,以及是否使用CustomCommand()
显示某些信息。
void MyUserControl_VisibleChanged(object sender, EventArgs e)
{
//MessageBox.Show("");
UserControl us = sender as UserControl;
if (us.Visible)
{
CustomCommand();
}
//MessageBox.Show("");
}
问题出现了:这个代码按原样会错误地认为UserControl在不可见时是可见的,CustomCommand()
将在不应该运行时运行。当注释掉的MessageBox
函数在任一点中都未被注释时,UserControl被正确地视为不可见,直到选择了TabPage为止。有谁知道为什么会这样?
答案 0 :(得分:1)
将它放在TabPage上并不能解释这个问题。必须涉及其他布局事件,以便稍后实际可见控件。 MessageBox.Show()调用提供时间机器以延迟检查Visible属性。
使用Control.BeginInvoke()方法获取代码以便稍后运行的标准技术(MessageBox的方式)。当所有事件都被触发并处理并且UI线程再次空闲时,委托目标运行。像这样:
void MyUserControl_VisibleChanged(object sender, EventArgs e)
{
UserControl us = sender as UserControl;
this.BeginInvoke(new Action(() => {
if (us.Visible)
{
CustomCommand();
}
});
}
答案 1 :(得分:0)
不确定这是否对您有所帮助,但Visible_Changed
事件有一种奇怪的,无法记录的不对称行为:
只要控件的Visible属性发生变化, 为true或为false,就会引发它。
只要Parent的Visible属性变为true且仅变为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
替换它。