聚焦表格而不将其带到其他表格之前

时间:2016-12-15 07:51:15

标签: c# winforms focus bringtofront

使用Focus()方法时,目标表单会获得焦点,但也会被带到其他表单前面。

有没有办法避免这种z次序修改?

这是一个简短的例子:

class MyForm : Form
{
    static void Main(string[] args)
    {
        MyForm f1 = new MyForm()
        {
            Text = "f1"
        };
        f1.Show();

        MyForm f2 = new MyForm()
        {
            Text = "f2"
        };
        f2.Show();

        Button b1 = new Button();
        b1.Click += (sender, e) => f2.Focus();
        f1.Controls.Add(b1);

        Button b2 = new Button();
        b2.Click += (sender, e) => f1.Focus();
        f2.Controls.Add(b2);

        Application.Run(f1);
    }
}

点击f1中的按钮时,f2会获得焦点,但也会出现在f1之前(这是我想要避免的事情)。< / p>

1 个答案:

答案 0 :(得分:0)

不确定这是最好的方法,但我最终使用了所有者属性:

class MyForm : Form
{
    public const int WM_NCLBUTTONDOWN = 0x00A1;

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_NCLBUTTONDOWN:
                TakeFocus();
                base.WndProc(ref m);
                break;

            default:
                base.WndProc(ref m);
                break;
        }
    }

    private void TakeFocus()
    {
        if (Owner == null && OwnedForms.Length > 0)
        {
            Form tmp = OwnedForms[0];
            tmp.Owner = null;
            Owner = tmp;
        }
        BringToFront();
    }

    static void Main(string[] args)
    {
        MyForm f1 = new MyForm()
        {
            Text = "f1",
        };
        f1.Show();

        MyForm f2 = new MyForm()
        {
            Text = "f2",
        };
        f2.Owner = f1;
        f2.Show();

        Button b1 = new Button();
        b1.Click += (sender, e) =>
        {
            f1.TakeFocus();
        };
        f1.Controls.Add(b1);

        Button b2 = new Button();
        b2.Click += (sender, e) =>
        {
            f2.TakeFocus();
        };
        f2.Controls.Add(b2);

        Application.Run(f1);
    }
}

在此示例中,窗口获得焦点,而不是在单击其客户区域时进入另一个窗口的前面。 如果您单击非客户区域(标题栏和边框)或按钮,表单将获得焦点并被带到前面。