【问题标题】:Keep one control over another always in windows forms .net始终在 Windows 窗体 .net 中保持一个对另一个的控制
【发布时间】:2012-08-19 03:56:42
【问题描述】:

假设有两个重叠的控件:

  • 控制 A
  • 控制 B

我想在任何情况下都保持控制 A 优于控制 B。

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

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

【问题讨论】:

  • 子控件的z-order改变时是否会发生父绘制事件? z 顺序发生变化的控件是否会发生这种情况?
  • 控件(以及受更改影响的其他控件)可能需要重新绘制,所以是的..
  • 我用Control B的Paint事件调用了ControlA.BringToFron(),好像可以了。

标签: .net winforms layout controls z-order


【解决方案1】:

不喜欢在 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2017-09-28
    相关资源
    最近更新 更多