Nat*_*han 15 c# controls winforms
除了control.BringToFront()之外还有其他方法可以将控件带到前面吗?我在用户控件上有一系列标签,当我尝试将其中一个标签放在前面时,它无法正常工作.我甚至已经完成所有控件的循环并将它们全部发送回去,除了我感兴趣的那个并且它没有改变一件事.
以下是将标签添加到用户控件的方法
private void AddUserLabel()
{
UserLabel field = new UserLabel();
++fieldNumber;
field.Name = "field" + fieldNumber.ToString();
field.Top = field.FieldTop + fieldNumber;
field.Left = field.FieldLeft + fieldNumber;
field.Height = field.FieldHeight;
field.Width = field.FieldWidth;
field.RotationAngle = field.FieldRotation;
field.Barcode = field.BarCoded;
field.HumanReadable = field.HumanReadable;
field.Text = field.FieldText;
field.ForeColor = Color.Black;
field.MouseDown += new MouseEventHandler(label_MouseDown);
field.MouseUp += new MouseEventHandler(label_MouseUp);
field.MouseMove += new MouseEventHandler(label_MouseMove);
userContainer.Controls.Add(field);
SendLabelsToBack(); //Send All labels to back
userContainer.Controls[field.FieldName].BringToFront();
}
Run Code Online (Sandbox Code Playgroud)
这是将所有这些发送到后面的方法.
private void SendLabelsToBack()
{
foreach (UserLabel lbl in userContainer.Controls)
{
lbl.SendToBack();
}
}
Run Code Online (Sandbox Code Playgroud)
Han*_*ant 20
是的,还有另一种方式.这Controls.SetChildIndex()也改变了Z阶.索引为0的那个是顶部的那个.虽然不买你什么,但BringToFront()使用这种方法.
您SendLabelsToBack()给出的方法不起作用,它也会将标签发送到后面.但是你的下一个声明再次修复了这一点.
好的,这不起作用,这意味着该BringToFront()方法不会被执行.在"输出"窗口中查找"第一次机会异常"通知.如上所述,SendLabelsToBack()如果用户控件包含除UserLabel之外的任何控件,则会导致异常.此外,在调用后设置断点BringToFront()并检查userContainer.Controls[0].Name它何时中断的值.
控件的z-index是每个容器.
如果在容器(例如a Panel)内的控件上调用BringToFront ,则不会将容器放在前面.
因此,控件只会在该容器中的其他控件前面.
若要查看控件所在的容器,可以使用"视图"菜单中的"文档大纲"窗格.
编辑:您的userContainer控制可能背后是一个不同的控件.
您是否尝试过Invalidate()之后BringToFront()?BringToFront不会引发Paint事件
试试这个:
private void SendLabelsToBack()
{
foreach (UserLabel lbl in userContainer.Controls)
{
lbl.SendToBack();
lbl.Invalidate();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
76348 次 |
| 最近记录: |