为什么MDI父表单在聚焦时会重置子表单的Z索引?

时间:2009-07-03 04:58:32

标签: .net winforms c#-3.0

这是.net中的WinForm应用程序问题。这是关于MDI表格。

我有一个MDI表单(ParentForm),我可以在其中创建ChildForm的许多实例表单。我创建了两个ChildForm,名为cf1和cf2。因此,cf1的Z指数低于cf2,cf2将位于cf1之上。

然后我切换到其他形式,这意味着ParentForm在Windows中失去了它的焦点。然后我切换回ParentForm。发生这种情况时,ParentForm会自动将cf1置于cf2之上。

如果我有三个ChildForm实例,也会发生这种情况。当我切换回ParentForm时,ParentForm总是首先将创建的实例置于顶部。

现在有趣的是,它当然仅适用于ChildForm(如果是任何子表单的情况,那将是.net的错误)。我认为我的ChildForm中有一些错误触发了这个但我不知道那是什么。 ChildForm和ParentForm都没有onActive事件。

ChildForm的实例直接在ParentForm中创建,示例代码为:

ParentForm_CreateChildForm(){
    var cf = new ChildForm();
    cf.MdiParent = this;
    cf.Show();
}

任何人都会遇到这种情况,欢迎给我一些关于可能出现问题的提示。

2 个答案:

答案 0 :(得分:0)

在某些情况下,如果重点是对表单的禁用控件,则可能会发生这种情况。我不知道这是不是你的情况,但任何焦点问题都可以通过使用重点关注的MenuStrip / ToolStrip来解决。 更多链接后: MSDN forums

答案 1 :(得分:0)

这可能是一个非常难以回答的问题,因为问题本身太模糊了。让我谈谈我发现的与此问题相关的内容。

表单包含列表视图及其数据绑定。数据绑定的更改将触发对选项卡控件的更改。根据选择列表视图中的项目,选项卡控件显示一些选项卡页面。要显示的选项卡页面根据列表视图中选择的不同类型的项目而有所不同。

众所周知,无法在选项卡控件上隐藏或显示某些标签页。实现类似效果的唯一方法是清除选项卡控件上的选项卡页面,并将显示选项卡页面的选项卡添加到其中。

似乎这种关系触发了意外激活的表单。当MDI父窗体的焦点发生更改时,子窗体将按顺序重新绘制,当窗体重新绘制时,数据绑定会更新并触发对选项卡控件的更改并激活窗体。我没有充分探索所有这些链条,因为它们可以深入到框架本身。调试完全没有用,因为激活部分只会导致我无法调试的外部代码。将断点设置为删除和添加标签页的代码也不起作用。断点永远不会被击中,但很可靠的是,周围的代码有所不同。这是我仍然困惑的一部分。为什么断点永远不会被击中,但是评论周围的代码实际上是有区别的。如果有人能解释我的困惑,我会很高兴。

现在我的解决方案。我转到删除并添加标签页的代码。我不是每次都删除和添加标签页,而是将“去展示”标签页保存到一个集合中,并将此集合与当前标签控件的标签页设置进行比较。如果它们相同,则不需要进行任何更改。如果它们不相同,则清除标签页并添加回执行。在我的问题情况下,标签页应该永远不需要更新,因此标签页清除和添加后面永远不需要。令人惊讶的是,这种变化确实解决了我的问题。

虽然我相信我解决这个问题的方法不是一个肤浅的方法,但我确实没有把整个故事挖出来。如果有人在听完我的故事之后,对整个故事有任何想法,并且有任何更好的解决方案的建议,我将非常乐意听取它。

谢谢。