MessageBox改变了看似无关的东西

时间:2014-07-07 16:33:37

标签: c# winforms c#-4.0 user-controls

这是我的设置:我有一个带有多个标签的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为止。有谁知道为什么会这样?

2 个答案:

答案 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替换它。