当停靠控件可见时Z顺序更改

use*_*489 5 c# docking z-order

我在.NET Framework 4.0版中使用C#Winforms

我有一个面板,其中包含四个标签,所有标签都停靠在面板的顶部.中间的两个标签是隐藏的.

---顶部---
标签一(可见)
标签二 - (不可见)
标签三(不可见)
标签四 - (可见)
---底部---

单击带有以下代码的按钮时

private void btnShowLabels_Click(object sender, EventArgs e)
{
    this.lblTwo.Visible = true;
    this.lblThree.Visible = true;
}
Run Code Online (Sandbox Code Playgroud)

标签二和三出现,但它们的z顺序混合起来,如下所示.

---顶部---
标签一(可见)
标签(可见)
标签 - (可见)
标签四 - (可见)
---底部---

为什么z顺序会发生变化,如何阻止这种情况发生.

我意识到我可以BringToFront()在点击事件中使用重新排序所有标签,但这对于更复杂的对接安排尤其有点过分.

小智 6

Control.Visible = True有时设置更改Z顺序.它似乎取决于句柄创建.

对我来说,这个(显然没有意义的)陈述完美地帮了我

foreach (Control ctrl in FlpDetails.Controls)
{
    IntPtr DummyHandle = ctrl.Handle;
}
Run Code Online (Sandbox Code Playgroud)

它强制所有控件创建句柄.之后control.visible = true不再改变Z顺序.

我从外部网站获得了该解决方案,该网站现在转发到钓鱼网站.


use*_*861 5

停靠顺序似乎与 z-order 有点不同,并且使用 SetChildIndex 您仍然必须按.Visible特定顺序分配每个标签的属性。我已经尝试过让 lbl1 和 lbl4 以不同的顺序出现,但它们总是保持在它们的位置。我认为您最好的选择是按照您通常认为的“相反”顺序调用“中间”标签。

编辑:这是一种您可以始终保持相同停靠顺序的方法,而不必担心始终按顺序设置每个标签的可见属性。只需创建这个可以附加到每个停靠标签VisibleChanged事件的事件处理程序:

void GenericDockedLabel_VisibleChanged(object sender, EventArgs e)
{
    this.Controls.SetChildIndex(lbl1, 3);
    this.Controls.SetChildIndex(lbl2, 2);
    this.Controls.SetChildIndex(lbl3, 1);
    this.Controls.SetChildIndex(lbl4, 0);
}
Run Code Online (Sandbox Code Playgroud)

@Mark 寻找 SetChildIndex 的道具