Открыть модальное окно в центре родительской формы в приложении MDI - PullRequest
6 голосов
/ 14 июня 2011

Я работаю над приложением Winform и хочу открыть модальную форму в центре родительской формы. В приложении Winform есть:

  1. Форма MDI (открывается как форма запуска и действует как контейнер для всех)
  2. при нажатии одного из пунктов меню формы MDI - открывает дочернюю форму MDI
  3. при нажатии одной из кнопок на MDI Child, открытом на шаге 2 - открывается модальная форма, которую нужно открыть в центре MDI Child (открывается на шаге 2)

Итак, для открытия модальной формы в центре 1-е очевидное решение, которое я сделал, это

TestModalForm obj = new TestModalForm()
obj.StartPosition = FormStartPosition.CenterParent;
obj.showdialog(this);

, но вышеприведенное решение не сработало, так как модальная форма всегда рассматривает MDI-форму как своего родителя. Поэтому я тренируюсь для 2-го решения: в этом я написал метод в Form Load модального окна, чтобы расположить его в центре, как показано ниже:

        private void MakeWinInCenter()
        {
            if (this.Owner != null)
            {
                Form objParent = null;
                int TopbarHeight = 0;
                if (this.Owner.IsMdiContainer && this.Owner.ActiveMdiChild != null)
                {
                    objParent = this.Owner.ActiveMdiChild;
                    TopbarHeight = GetTopbarHeight(this.Owner);
                }
                else
                    objParent = this.Owner;

                Point p = new Point((objParent.Width - this.Width) / 2, (objParent.Height - this.Height) / 2);
                p.X += objParent.Location.X;
                p.Y += TopbarHeight + objParent.Location.Y;
                this.Location = p;
            }
            else
            {
              //If owner is Null then, we have reference of MDIForm in Startup Class - use that ref and opens win in center of MDI
                if (Startup.MDIObj != null)
                {
                    this.Left = Convert.ToInt32((Startup.MDIObj.Width - this.Width) / 2);
                    this.Top = Convert.ToInt32((Startup.MDIObj.Height - this.Height) / 2);
                }
            }

        }

        private int GetTopbarHeight(Form MDIForm)
        {
            int TopbarHeight = 0;
            MdiClient objMDIClient = null;
            foreach (Control ctl in MDIForm.Controls)
            {
                if (ctl is MdiClient)
                {
                    objMDIClient = ctl as MdiClient;
                    break;
                }
            }
            if (objMDIClient != null)
            {
                TopbarHeight = MDIForm.Height - objMDIClient.Size.Height;
            }
            return TopbarHeight;
        }

Вышеупомянутое решение прекрасно работает, когда MDI-форма открывается в развернутом виде. Но когда мы проверили, изменив размер формы MDI (т.е. не в развернутой форме) или переместив форму MDI на другой экран - в случае нескольких экранов вышеуказанное решение не работает и не открывает модальную форму в центре дочерней формы MDI

Также посмотрел на этот вопрос , но это не помогло моей проблеме.

Может кто-нибудь есть какие-либо предложения или решения для решения проблемы.

Спасибо

Ответы [ 5 ]

1 голос
/ 14 июня 2011

Попробуйте это:

TestModalForm.showdialog(this.MdiParent);
0 голосов
/ 28 июля 2016

Чтобы показать форму, используя ShowDialog в центре ее родителя, когда родитель MDI Child , вы можете использовать следующий код

Код должен запускаться с кнопки в MDI дочерняя форма и отображение другой формы в виде модального диалога в центре MDI дочерней формы:

var dialog = new Form(); //The form which you want to show as dialog
//this.Parent point to the MdiClient control which is the container of this
var p = this.Parent.PointToScreen(this.Location); 
p.Offset((this.Width - dialog.Width)/2 , (this.Height - dialog.Height)/2);
dialog.StartPosition = FormStartPosition.Manual;
dialog.DesktopLocation = p;
dialog.ShowDialog();

В приведенном выше коде, поскольку текущая форма является MDIЗатем дочерний элемент this.Parent указывает на элемент управления MdiClient, который является контейнером дочерних форм MDI, поэтому мы можем использовать его метод PointToScreen, передающий местоположение дочернего элемента MDI (это), чтобы получить местоположение экрана MDI ребенка.Затем, если вы смещаете это местоположение, используя половину разницы между дочерними элементами MDI и шириной и высотой диалогового окна, установите StartPosition для диалогового окна на FormStartPosition.Manual и покажите его с помощью ShowDialog.

0 голосов
/ 26 мая 2016

В формах MDI center to parent не работает должным образом, см. Документацию MSDN , всегда рекомендуется использовать center to screen, но я использую обходной путь, в конце концов, это опозиционирование по местоположению, поэтому я создал метод переопределения для center to parent и использовал его в дочерней форме load event, чтобы при каждой загрузке дочернего элемента он центрировался по отношению к родителю:

private void CenterToParentOverride()
   {
      this.Location = new Point(
          this.MdiParent.ClientSize.Width / 2 - this.Width / 2,
          this.MdiParent.ClientSize.Height / 2 - this.Height / 2);
   }
0 голосов
/ 20 декабря 2013

Я думаю, вы должны сделать это

//for modal form set its strat position to centerparent like this

**this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;**

// this will open the modalform in center of parent form
0 голосов
/ 26 марта 2013

Ваш метод кажется слишком сложным.Почему бы просто не сделать это таким образом?

// All code goes in your MDI Child form

// Create the modal form
TestModalForm obj = new TestModalForm();

// Find center point of MDI Parent form
Point centerPoint = new Point(this.MdiParent.Top + this.MdiParent.Height / 2,
                              this.MdiParent.Left + this.MdiParent.Width / 2);
// Set the location and show the modal form
obj.StartPosition = FormStartPosition.Manual
obj.Location = centerPoint;
obj.ShowDialog(this);
...