我先前问了这个问题,并且认为我已经弄明白但是它仍然无效。 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()无法在这个实例中正确使用吗?那么我有什么选择?任何?
答案 0 :(得分:20)
如果您要设置表单位置,则必须将表单WindowState
设置为Normal
(在任何其他设置上,根据规则为您设置位置该设置,以及您的值被忽略),以及StartPosition
到Manual
。
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)
您是否尝试过显示表单,然后调整位置?
编辑:或者,您是否尝试过调整左侧和顶部属性?