Открыть модальное окно в центре родительской формы в приложении MDI

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

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

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

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

, но вышеприведенное решение не сработало, поскольку модальная форма всегда рассматривает форму MDI как свою родительскую. Итак, я тренируюсь для второго решения: в нем я написал метод в окне "Загрузка формы" модального окна, чтобы расположить его в центре, как показано ниже:

        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

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

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

Спасибо

6
задан Community 23 May 2017 в 11:53
поделиться