如何打开以父项为中心的子表单?

时间:2013-03-21 18:18:35

标签: c# multithreading winforms

我正在使我的程序多线程,因为它是Bukkit(Minecraft)的服务器管理器,对某些系统而言非常重要。现在我面临一个小问题。当我想打开一个新的子表单时,我无法告诉它中心表格。它只是做我告诉表格要做的事情。我找到了一个解决方法,但我不知道它是否可以更容易完成,或者我是否需要更改其他内容。

这是我的代码:
工程

private void ThreadFrmSettings()
{
    Form frmSettings = new frmSettings();
    frmSettings.StartPosition = FormStartPosition.Manual;
    frmSettings.Location = new Point(Location.X + (Width - frmSettings.Width) / 2, Location.Y + (Height - frmSettings.Height) / 2);
    frmSettings.ShowDialog();
}

无效

var frmSettings = new frmSettings();
frmSettings.ShowDialog();

这种行为是正常的吗?谢谢!

2 个答案:

答案 0 :(得分:0)

StartPosition = FormStartPosition.CenterScreen;的{​​{1}}属性怎么样?

From

注意: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { StartPosition = FormStartPosition.CenterScreen; Form frmSettings = new Form(); frmSettings.Width = 300; frmSettings.Height = 200; frmSettings.StartPosition = FormStartPosition.CenterScreen; //frmSettings.Location = new Point(Location.X + (Width - frmSettings.Width) / 2, Location.Y + (Height - frmSettings.Height) / 2); frmSettings.ShowDialog(); } } 给出了不同的结果,在这种情况下,窗口不会位于中心。

以下是带有线程/任务的示例

frmSettings.Show();

enter image description here

答案 1 :(得分:0)

我已经按照MadScienceDreams的建议获得了我想要的结果,这就是执行这个技巧的代码:

this.Invoke(new MethodInvoker(()=>ThreadFrmSettings())