Форма MDI 'creep' (изменение положения в окне MDI) - PullRequest
3 голосов
/ 17 января 2009

У меня есть приложение VB.NET MDI WinForms. Мои пользователи жаловались на ползучесть формы (как они ее называют), именно здесь каждый раз, когда вы открываете определенную форму в основном окне MDI, она открывается чуть ниже и справа от места, которое она загружала ранее - т.е. вверху слева от окна и идет вниз до нижнего правого.

Я должен согласиться с ними, что это очень раздражает, есть ли способ предотвратить это? Код для загрузки форм:

frmPurchaseInvoiceSelect.Show()
frmPurchaseInvoiceSelect.MdiParent = Me

Я могу несколько решить эту проблему, установив начальные позиции форм в «Ручной», но затем они просто открываются непосредственно друг над другом в верхнем левом углу экрана.

Другие пользователи SO сталкивались с этим?

Ответы [ 5 ]

3 голосов
/ 17 января 2009

Попробуйте

frmPurchaseInvoiceSelect.StartPosition = FromStartPosition.CenterParent

всегда начинать с центра родителя Mdi.

Есть несколько вариантов, но это зависит от того, где вы хотели бы запустить форму. Я не пробовал, но:

frmPurchaseInvoiceSelect.Location = windowPoint
frmPurchaseInvoiceSelect.Size = windowSize
frmPurchaseInvoiceSelect.StartPosition = FormStartPosition.Manual  

должен начинать форму именно там, где вы хотите.

1 голос
/ 19 ноября 2015

следующие решили это для меня frmUser.StartPosition = FormStartPosition.Manual при повторном открытии он перестал «ползать»

1 голос
/ 10 декабря 2011

См. Мой вопрос и полученный ответ, который вполне может помочь вам в решении этой проблемы. Вы также можете посмотреть на мою очень многословную запись blog на эту тему. Мой код написан на Delphi, но вы должны быть в состоянии перенести концепции в VB.

0 голосов
/ 17 января 2009

MBoy,

Приложения MDI обычно не отображают окна по центру, хотя приложения SDI могут. В приложении MDI с несколькими открытыми окнами пользователь обычно хочет видеть край каждого окна (каскадное представление), чтобы он мог щелкнуть нужное окно, чтобы вывести его вперед. Обычно это можно сделать двумя способами. Узнайте, сколько окон открыто и их положение относительно кадра MDI. Откройте последующие окна чуть ниже и справа от последнего окна. Эта функциональность обычно предоставляется в используемом языке или библиотеке. Второй способ состоит в том, чтобы иметь выбор (меню или иным образом) для отображения открытых окон после факта в нужной ориентации (каскадно, мозаично или слоисто). Как я упоминал ранее, если функция отображения MDI не предоставляется автоматически в языке / библиотеке, ее необходимо будет кодировать вручную. Это можно сделать в функции, которая вызывается при открытии каждого окна MDI, но до того, как оно становится видимым.

0 голосов
/ 17 января 2009

Независимо от используемого языка, причина одна и та же. Когда вы открываете первое окно MDI, начальная точка составляет 0,0 относительно кадра MDI, поэтому он открывается в левом верхнем углу кадра. Если вы закроете окно, а затем снова откроете его, начальная точка больше не будет 0,0, а будет иметь другое значение в зависимости от того, как вы открываете окна (каскад и т. Д.). Обычно оно будет немного ниже и правее предыдущего окна, закрыто. Проблема существует, потому что вы или инструмент не проверяете, является ли открываемое окно единственным экземпляром окна во фрейме. Если окно является единственным экземпляром, откройте его в 0,0, в противном случае откройте его в соответствующей позиции относительно других окон.

Эта функция обычно обрабатывается используемой вами библиотекой MDI, или, если нет, вы бы закодировали ее вручную. Это займет всего несколько строк, чтобы закодировать это вручную, так что это должно быть тривиально реализовать.

...