我正在尝试在应用程序启动之前显示一个表单并获取其DialogResult
,所以我只是创建它并使用ShowDialog
(因为Application.Run
的返回值是空隙)。
我担心的是,它可能会被当时可能显示的其他表格错误地“劫持”。显然,不是这个应用程序。请参阅What is the meaning of Form.Show(null)?,建议不要使用ShowDialog
的无参数重载。
我已经测试并看到Form的Owner
属性为null。但它会永远如此吗?或者我应该创建一个表单并将其用作所有者而不显示它?这似乎是一个奇怪的解决方案,但逻辑上它应该避免任何问题。或者会引入新的?
答案 0 :(得分:3)
不是这个应用程序,显然
这已经由Windows负责,它强制在线程拥有的进程和窗口之间进行强有力的分离。例如,对话框所有者的典型选择是GetActiveWindow()返回的窗口。活动窗口是线程的属性。例如,这解释了为什么从工作线程发出的MessageBox.Show()调用永远不会模态到其他窗口。
在技术上可以对另一个进程的窗口进行窗口模式,但需要付出很多努力。该应用程序必须调用AttachThreadInput(),这是一个非常不起眼的winapi函数,没有人偶然打电话。也是一个很好的死锁来源。
除非你在索马里海岸附近的船上编程,否则没有充分的理由担心你的窗户被劫持。
答案 1 :(得分:0)
[STAThread]
static void Main()
{
Form1 form1 = new Form1();
//here I suppose the form you want to show
Form1 form2 = new Form2();
form2.ShowDialog(form1);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(form1);
}
答案 2 :(得分:0)
基本上,当此窗口没有父项时,您使用ShowDialog()
。通常这发生在主窗口。如果你打开一个接一个的窗口,而在关闭之前的窗口,则会有多个ShowDialog()
s。
如果您正在显示对话框(也是一个窗口),那么您可以指定它的父级来实现某种行为。例如,当alt-tabbing到该窗口时,它的对话框将显示在前面。把这看作是做父子关系。
我不知道这个案子,当多个表格声称同一个父母。但这听起来像是一个明显的错误,例如:
public Form1 FormMain = new Form1();
...
// show main form
FormMain.ShowDialog();
...
// somewhere in the main form - show dialog
Form2 form2 = new Form2();
form2.ShowDialog(FormMain);
...
// somewhere in form2 - show dialog
Form3 form3 = new Form3();
form3.ShowDialog(FormMain); // wrong, should be form2!
答案 3 :(得分:0)
这是未经过测试的,因为我无法重新创建父类除了null
之外的任何情况(即对第三方未管理父级的引用),但也许你可以做类似这样的事情在您的表单上将父级设置为null
,如果它发生更改:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
this.ParentChanged += MyParentChanged;
}
public void MyParentChanged(Object sender, EventArgs e)
{
this.Parent = null;
}
}