Form.Location不起作用

时间:2009-08-12 17:40:50

标签: c# winforms

我先前问了这个问题,并且认为我已经弄明白但是它仍然无效。 Form.Show() moves form position slightly

所以我有一个父表单,用show()打开一堆子项,然后当需要一个时,我使用bringToFront()来显示它。问题是当show()被调用时,子窗体完全对齐但是当我使用bringToFront时,它会向左和向下移动1 px,这会使我的边框变形。我在show()之前将所有子窗体startPosition属性设置为Manual。我在前面设置了frm.location = new Point(x,y)。当show()时,我也试过明确设置frm.location。当我带上ToFront()时,它仍然左右移动1 px。有没有什么与bringToFront()不允许我更改窗体的位置属性?这是我的代码:

if (myNewForm != null)
{
    myNewForm.MdiParent = this;

    bool isFormOpen = false;

    foreach (Form frm in Application.OpenForms)
    {
        if (frm.GetType() == myNewForm.GetType())
        {
            frm.WindowState = FormWindowState.Maximized;
            frm.BringToFront();
            frm.Location = new Point(-4, -30);
            isFormOpen = true;
            break;
        }
    }

    if (!isFormOpen)
    {
        myNewForm.StartPosition = FormStartPosition.Manual;
        myNewForm.Show();
    }
}
编辑:好的,显然微软有一个错误,让StartPosition只适用于ShowDialog()而不是Show(),但拒绝修复它:http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=107589

但我的应用程序需要保持所有不同的表单打开,并在需要时将它们带到前面...所以ShowDialog()无法在这个实例中正确使用吗?那么我有什么选择?任何?

5 个答案:

答案 0 :(得分:20)

如果您要设置表单位置,则必须将表单WindowState设置为Normal(在任何其他设置上,根据规则为您设置位置该设置,以及您的值被忽略),以及StartPositionManual

frm.WindowState = FormWindowState.Normal;
frm.StartPosition = FormStartPosition.Manual;
frm.BringToFront();
frm.Location = new Point(-4, -30);

答案 1 :(得分:2)

你试过了吗?

this.Location

Form.ActiveForm.Location

答案 2 :(得分:1)

我认为表单是由处理Show()(和BringToFront)请求的代码移动的,所以你实际上无法在调用方法之前或之后设置表单的位置 - 因为表单位置将在主窗口中的代码已执行(并将控件返回到窗口消息泵,基本上以Win32术语表示)。

我会为每个表单使用Form的子类,然后添加一个显式的Point属性,指示该特定表单的固定位置。在这个类中,重写OnShown虚方法(或者也许是OnActivated方法),只需使用正确的位置更新this.Location。

这应该强制表单到正确的位置,即使Windows窗体中的某些代码在某个时候更改它。

答案 3 :(得分:1)

使用p/Invoke to MoveWindow怎么样?提供的链接包括一个C#示例。

答案 4 :(得分:0)

您是否尝试过显示表单,然后调整位置?

编辑:或者,您是否尝试过调整左侧和顶部属性?