Form.Location不起作用

nov*_*ara 7 c# winforms

我之前问了这个问题,并且认为我已经弄明白但是它仍然无效. Form.Show()稍微移动窗体位置

所以我有一个父表单,用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

小智 21

如果您希望设置表单位置,则必须将表单设置WindowStateNormal(在任何其他设置上,根据该设置的规则为您设置位置,以便忽略您的值),并将其设置StartPositionManual.

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


Arm*_*rat 1

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