始终在Windows窗体.net中保持一个控件

时间:2012-08-23 15:17:48

标签: .net winforms layout controls z-order

让我们说有两个重叠的控件:

  • 控制A
  • Control B

我想在任何情况下都将Control A保持在Control B之上。

控制B的z顺序可以通过调用BringToFront()或通过调用Parent.SetChildIndex(ControlB, 0)在父级中设置其索引来动态更改。所以无论何时发生这种情况,我都希望Control A能够出现在ControlB之前。

我正在寻找更改z顺序时发生的一些事件,以便我可以将Control A带到前面。有没有这样的事件?或者有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

不喜欢Paint Events上的垃圾邮件。特别是因为当控件在屏幕外时不会发送WM_PAINT,所以在代码期望的时候可能不会发生操作。

更有效的控制方法是在控件位置发生变化时进行处理。

更改您的控件以从中派生(将基类更改为您使用的任何内容)并设置字段:

firstControl.ChildControl = secondControl;

public class AlwaysParentingControl : TextBox
{
    private const Int32 WM_WINDOWPOSCHANGED = 0x47;
    public Control ChildControl { get; set; }

    protected override void WndProc(ref Message m)
    {
        if( m.Msg == WM_WINDOWPOSCHANGED && ChildControl != null)
            ChildControl.BringToFront();

        base.WndProc(ref m);
    }
}