【问题标题】:How do I open a child Form centered over its Parent?如何打开以父表单为中心的子表单?
【发布时间】:2013-03-11 09:54:02
【问题描述】:

我正在使我的程序多线程,因为它是 Bukkit (Minecraft) 的服务器管理器,这对于某些系统来说相当繁重。现在我面临一个小问题。当我想打开一个新的子表单时,我不能告诉中心父。它只是不做我告诉表格要做的事情。我已经找到了解决方法,但我不知道是否可以更轻松地完成,或者我是否必须更改其他内容。

这是我的密码:
Works

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();

这种行为正常吗?谢谢!

【问题讨论】:

  • FromStartPosition = FormStartPosition.CenterScreen; 属性怎么样?
  • 多线程是什么让你特别烦恼? “ShowDialogue”的默认行为不是“centerparent”,无论您是否有多个线程。
  • @MadScienceDreams 当我删除多线程时,代码可以完美运行:/.
  • 你没有告诉 frmSettings 关于父母的事情。

标签: c# multithreading winforms


【解决方案1】:

FromStartPosition = FormStartPosition.CenterScreen; 属性呢?

 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(); 给出不同的结果,在这种情况下,窗口不会位于中心。

这是带有线程/任务的示例

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            StartPosition = FormStartPosition.CenterScreen;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Task.Factory.StartNew(() => {

                Form frmSettings = new Form();
                frmSettings.Width = 300;
                frmSettings.Height = 200;
                frmSettings.StartPosition = FormStartPosition.CenterParent;

                frmSettings.ShowDialog();

            } );   

        }
    }

【讨论】:

  • 这行得通,但它不会将表单放入父级的中心:p。至少,不适合我。
  • @FoxyShadoww 使用此行frmSettings.StartPosition = FormStartPosition.CenterParent;
  • @FoxyShadoww 但实际上你想要什么?你需要稍微移动一下你的窗户吗?
  • 我需要在其父级的中心打开它。
  • @FoxyShadoww 好吧.. 我发送给您的代码运行良好。也许您有一些额外的设置来抑制正常行为。
【解决方案2】:

我遵循了 MadScienceDreams 的建议并得到了我想要的结果,这就是成功的代码:

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

【讨论】:

  • MethodInvoker 来自Microsoft.JScript?该页面显示“此 API 支持 .NET Framework 基础结构,不打算直接从您的代码中使用。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
相关资源
最近更新 更多