控件的 dock 问题

jmcooler 2016-10-09 02:42:58
我用代码,添加一些控件,它们依次 Dock 到一个 Form 顶端:
大致的代码如下:

foreach( string varName in engines.Keys )
{
Control dockCtrl = new MyCustomControl( varName, 该控件需要的其他参数 );
dockCtrl.Dock = DockStyle.Top;
parentForm.Controls.Add( dockCtrl );
}


本希望这些控件,按照 foreach 循环的添加顺序进行排列,然而,结果却是倒序的。
怎么会是这样的呢? 顺序添加的控件,并顺序 Dock,结果却是倒序的?

为么窗口在设计时,顺序添加的控件,却是顺序 Dock 的? 运行时,用代码添加的控件却是倒序的?

难道,我要将集合 engines.Keys 先转换为数组,然后倒序遍历,来添加控件?

虽然,我知道,调用一下 dockCtrl.BringToFront() 能把顺序纠正过来。但我不想这么做,
因为,这些控件,会随着用户选择的引擎不同,而动态添加和删除。
一个 BringToFront() 的调用,只要有少许变化,则整个控件重新 Dock,闪烁半天。
要是能先修改 Z-Order 顺序,再把它 Dock 到父窗口,那就好了
...全文
139 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jmcooler 2016-10-09
  • 打赏
  • 举报
回复
截个图,下面是添加进去的控件,顺序 dock 到顶部的效果:

jmcooler 2016-10-09
  • 打赏
  • 举报
回复
弄不好,我还要想下面的两招: 1、重载 WinProc() 函数,在添加控件的时候,拦截 Paint 消息 和 擦除背景消息,就不让它刷新界面。 2、不用 Dock 了,自己管理控件的位置。用 Dock 的用户体验太差了。 不能让已经添加进去的控件位置,随意变动。无论用户选择的引擎如何变化,这些控件的相对位置,要基本和引擎的顺序保持一致。Form 中控件,可以插入,追加,或者删除,以保持良好的顺序。 貌似 Dock 无法完成,并且会导致一小点改动,将会带来大面积的闪烁和界面阻塞
jmcooler 2016-10-09
  • 打赏
  • 举报
回复
Form 有没有类似于 BeginUpdate() / EndUpdate() 的函数啊? 也就是说,关闭窗口的界面刷新,等全部加进去后,再执行统一刷新。 不然,你看下面 3 步: parentForm.Controls.Add( dockCtrl ); dockCtrl.Dock = DockStyle.Top; dockCtrl.BringToFront(); 这 3 步,都会导致 dockCtrl 在窗口上,变换位置。 一个 foreach 循环下来,如果控件有 10 来个,那要闪烁半天,才能调整好。
stherix 2016-10-09
  • 打赏
  • 举报
回复
的确会是倒序的,因为一个container里面包含多个Top控件的话 将一个控件设为Dock.Top的时候 他会把这个控件放到最上面,哪怕前面还有其他也为Top的控件 所以逆序添加才可以做到你的要求
  • 打赏
  • 举报
回复
foreach不能倒序遍历
要么用for-->这里对你不适用
要么自己迭代器-->麻烦
要么用数组排序-->简单,粗暴

数组排序示例:
static void Main(string[] args)
{
string[] array = new string[] { "NO1", "NO2", "NO3" };
Console.WriteLine("正序:");
foreach (string s in array)
{
Console.WriteLine(s);
}

Console.WriteLine("倒序:");
foreach (string s in array.Reverse())
{
Console.WriteLine(s);
}

Console.ReadLine();
}

打印结果:

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧