【问题标题】:How to CenterParent a non-modal form如何CenterParent非模态表单
【发布时间】:2012-01-23 21:26:16
【问题描述】:

我有一个从父窗体打开的非模态子窗体。我需要将子表单置于其父表单的中心。我已经将子窗体的属性设置为CenterParent 并尝试了这个:

Form2 f = new Form2();
f.Show(this);

但无济于事。这适用于模态形式,但不适用于非模态形式。任何简单的解决方案,或者我需要通过所有数学计算来将其位置固定到中心?

【问题讨论】:

  • 您是否尝试过设置StartPosition 属性?
  • 我试过了,我在问题中也提到过.. 它不适用于非模态对话框的 winforms.. 不知道为什么会这样..
  • 什么时候设置属性?
  • 嘿,请取消删除您的答案,它确实有效:) 我已将其设置在子表单的设计器中.. 但是像您说的那样设置确实可以解决问题.. 谢谢..

标签: c# winforms forms parent-child centering


【解决方案1】:
Form2 f = new Form2();
f.StartPosition = FormStartPosition.CenterParent;
f.Show(this);

【讨论】:

  • 你知道为什么它只能这样工作吗?而不是从子窗体的构造函数设置 centerParent 属性时?
  • 这对你有用吗?不为我工作。这段代码在哪里执行?
  • @kol 这对我有用。但我想这仅适用于 .net 4.. 我在 .net 2.0 中遇到过同样的问题 :)
  • @Rotem 这对我有用。但我想这仅适用于 .net 4.. 我在 .net 2.0 中遇到过同样的问题 :)
  • @kol,是的,很奇怪.. 对我来说,如果我在设计器中设置子表单的属性,它将无法工作。只有当我像答案中显示的那样设置时它才有效。您必须从父窗体设置对象的属性,如图所示!很奇怪
【解决方案2】:

恐怕StartPosition.CenterParent 只适用于模态对话框 (.ShowDialog)。
您必须手动设置位置:

Form f2 = new Form();
f2.StartPosition = FormStartPosition.Manual;
f2.Location = new Point(this.Location.X + (this.Width - f2.Width) / 2, this.Location.Y + (this.Height - f2.Height) / 2);
f2.Show(this);

【讨论】:

  • +1 为您提供这样的快速回答,但我在上面以更简单的方式得到了我想要的东西..
  • 由于其他答案不再适合我,我将把它标记为答案
  • 请注意Point 类需要using System.Drawing;
【解决方案3】:

Show(this) 的行为方式与 ShowDialog(this) w.r.t 表单居中的行为方式不同,这似乎很奇怪。我所提供的只是 Rotem 的解决方案,它以一种巧妙的方式隐藏了骇人听闻的解决方法。

创建一个扩展类:

public static class Extension
{
    public static Form CenterForm(this Form child, Form parent)
    {
        child.StartPosition = FormStartPosition.Manual;
        child.Location = new Point(parent.Location.X + (parent.Width - child.Width) / 2, parent.Location.Y + (parent.Height - child.Height) / 2);
        return child;
    }
}

毫不费力地调用它:

var form = new Form();
form.CenterForm(this).Show();

【讨论】:

    【解决方案4】:

    对于无模式形式,这是解决方案。

    如果要在父窗体的中心显示无模式对话框,则需要将子窗体的StartPosition 设置为FormStartPosition.Manual

    form.StartPosition = FormStartPosition.Manual;
    
    form.Location = new Point(parent.Location.X + (parent.Width - form.Width) / 2, parent.Location.Y + (parent.Height - form.Height) / 2);
    
    form.Show(parent);
    

    在 .NET Framework 4.0 中 - 如果将子窗体的 ControlBox 属性设置为 false 并将 FormBorderStyle 属性设置为 NotSizable,如下所示:

    form.ControlBox = false;
    form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
    

    如果将StartPosition 设置为FormStartPosition.Manual,您将面临部分子表单不显示的问题。

    要解决这个问题,您需要将子表单的Localizable 属性设置为true

    【讨论】:

    • 非常感谢。您关于表单的 Localizable 属性的 cmets 解决了一个困扰我多年的问题,在某些客户的系统上,我的弹出表单会稍微太小。微软没有很好地记录它。您是否了解它为什么起作用以及当 Localizable 为 false 时会发生什么?或知道任何解释它的好链接?再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多