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顺序.
我从外部网站获得了该解决方案,该网站现在转发到钓鱼网站.
停靠顺序似乎与 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 的道具
| 归档时间: |
|
| 查看次数: |
1449 次 |
| 最近记录: |