使用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>
答案 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);
}
}
在此示例中,窗口获得焦点,而不是在单击其客户区域时进入另一个窗口的前面。 如果您单击非客户区域(标题栏和边框)或按钮,表单将获得焦点并被带到前面。