.net MDI表格';蠕变';(MDI窗口中的位置更改)

.net MDI表格';蠕变';(MDI窗口中的位置更改),.net,vb.net,mdi,.net,Vb.net,Mdi,我有一个VB.NET MDI WinForms应用程序。我的用户一直在抱怨表单爬行(他们称之为表单爬行),每次在主MDI窗口中打开特定表单时,它都会在先前加载位置的右下方打开,即从窗口的左上角开始,一直向下到右下角 我必须同意他们的观点,这是非常令人恼火的,有什么方法可以防止这种情况发生吗?加载表单的代码为: frmPurchaseInvoiceSelect.Show() frmPurchaseInvoiceSelect.MdiParent = Me 我可以通过将表单启动位置设置为“手动”来解

我有一个VB.NET MDI WinForms应用程序。我的用户一直在抱怨表单爬行(他们称之为表单爬行),每次在主MDI窗口中打开特定表单时,它都会在先前加载位置的右下方打开,即从窗口的左上角开始,一直向下到右下角

我必须同意他们的观点,这是非常令人恼火的,有什么方法可以防止这种情况发生吗?加载表单的代码为:

frmPurchaseInvoiceSelect.Show()
frmPurchaseInvoiceSelect.MdiParent = Me
我可以通过将表单启动位置设置为“手动”来解决这一问题,但它们只是在屏幕左上角直接打开


其他用户遇到这种情况吗?

无论使用何种语言,原因都是一样的。打开第一个MDI窗口时,相对于MDI框架的起点为0,0,因此它将在框架内的左上角打开。如果关闭窗口然后重新打开,则起点不再是0,0,而是基于打开窗口的方式(层叠等)的其他一些值。通常,起点将略低,位于上一个关闭窗口的右侧。问题的存在是因为您或该工具没有检查要打开的窗口是否是框架内唯一的窗口实例。如果该窗口是唯一的实例,请在0,0处打开它,否则请在相对于其他窗口的适当位置打开它

此功能通常由您正在使用的MDI库处理,如果没有,您可以手动编写代码。手动编码只需几行代码,因此实现起来应该很简单。

试试看

frmPurchaseInvoiceSelect.StartPosition=fromtstartposition.centerproparent

始终从Mdi父对象的中心开始

有几个选项,但这取决于您希望表单从何处开始。我没有试过,但是:

frmPurchaseInvoiceSelect.Location = windowPoint
frmPurchaseInvoiceSelect.Size = windowSize
frmPurchaseInvoiceSelect.StartPosition = FormStartPosition.Manual  
应该在您想要的地方开始表单。

MBoy

MDI应用程序通常不以窗口为中心显示,尽管SDI应用程序可能会以窗口为中心显示。
在多个窗口打开的MDI应用程序中,用户通常希望看到每个窗口的边缘(级联视图),以便他/她可以单击所需的窗口将其置于最前面。这通常可以通过两种方式完成。了解打开的窗口数量及其相对于MDI框架的位置。打开最后一个窗口右下方的后续窗口。此功能通常在使用的语言或库中提供。第二种方法是选择(菜单或其他方式),以在所需方向(层叠、平铺或分层)显示打开的窗口。如前所述,如果语言/库中未自动提供MDI显示功能,则需要手动对其进行编码。这可以在一个函数中完成,该函数在打开每个MDI窗口时调用,但在它变为可见之前调用。

请参阅我的答案以及可能对您解决此问题有很大帮助的答案。你也可以看看我关于这个主题的冗长的条目。我的代码是用Delphi编写的,但是您应该能够将这些概念转移到VB中。

下面的内容为我解决了这个问题 frmUser.StartPosition=FormStartPosition.Manual
重新打开后,它停止了“爬行”

这就是每个应用程序的工作方式。打开两个计算器,或者两个记事本,你会看到它。我认为这不是问题。