2011-06-14 22 views
6

Estoy trabajando en la aplicación Winform y quiero abrir el formulario modal en el centro del formulario principal. En aplicación Winform existe:Abrir la ventana modal en el Centro del formulario principal en la aplicación MDI

  1. formulario MDI (abierta como formulario de inicio y actuar como contenedor para todos)
  2. el clic de uno de los elementos de menú del formulario MDI - se abre un formulario secundario MDI
  3. en haga clic en uno de los botones en MDI Niño abierto en el paso 2 - abre un formulario modal - que tenemos que abrir en el centro de MDI Formulario secundario (abierto en el paso 2)

Para abrir el formulario modal en el centro 1 La solución obvia que había hecho es

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

pero la solución anterior no funcionó ya que la forma modal siempre considera que MDI Form es su principal. entrenamiento así que por segunda solución: en la que escribí método en el formulario de carga de la ventana modal para colocarlo en el centro de la siguiente manera:

 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; 
     } 

encima solución funciona perfecto cuando formulario MDI se abre en forma maximizada. Pero cuando comprobamos cambiando el tamaño del formulario MDI (es decir, no en forma maximizada) o moviendo Formulario MDI a otra pantalla - en caso de pantallas múltiples, la solución anterior no funciona y no abre el formulario modal en el centro de MDI Child form

También miró this Question pero no es útil para mi problema.

Cualquier persona puede tener alguna sugerencia o solución para resolver el problema.

Gracias

Respuesta

1

Prueba esto:

TestModalForm.showdialog(this.MdiParent); 
+1

if (this.MdiParent! = Null) ... –

+0

Hola Davide, TestModalForm.showdialog (this.MdiParent); no funciona. También this.MdiParent da nulo por lo que se muestra en el centro de MDI, que no es necesario. Necesito abrir la tercera ventana modal en el centro de 2nd MDI Child. Su 3er punto en el comienzo de la pregunta. – Shah

0

Su método parece demasiado complicado. ¿Por qué no solo hacerlo de esta manera?

// 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); 
0

Creo que deberías hacer esto

//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

Hace que el cuadro de diálogo se muestre en el centro de MDI principal, mientras que el OP debe mostrarse en el centro del formulario MDI secundario. –

0

En MDI forma center to parent no funciona como se espera vea la documentación MSDN, siempre es recomendable utilizar center to screen, pero yo uso un trabajo en torno a esto, después de todo, se trata de posicionamiento de ubicación, así que creé un método de reemplazo para center to parent y lo usé en el formulario hijo load event para que cada vez que se cargue el elemento secundario se centre en principal:

private void CenterToParentOverride() 
    { 
     this.Location = new Point(
      this.MdiParent.ClientSize.Width/2 - this.Width/2, 
      this.MdiParent.ClientSize.Height/2 - this.Height/2); 
    } 
+0

El OP desea mostrar el cuadro de diálogo en el centro de MDI Child no en el centro del Formulario principal de MDI. –

0

Para mostrar formulario utilizando ShowDialog en el centro de su padre cuando el padre está MDI secundarios, puede utilizar siguiente código

Se supone que el código se ejecute desde un botón en un forma MDI secundarios y mostrar otra forma como de diálogo modal en el centro de la MDI Child formulario:

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(); 

en el código de seguridad, ya que la forma actual es un niño MDI, entonces this.Parent punto a t él MdiClient control que es el contenedor de formularios MDI secundarios, por lo que podemos utilizar su método PointToScreen pasando la ubicación de MDI secundario (esto) para obtener la ubicación de la pantalla MDI secundaria. Luego, si compensa esa ubicación utilizando la mitad de la diferencia entre MDI secundarios y el ancho y alto del cuadro de diálogo y configura el StartPosition del cuadro de diálogo al FormStartPosition.Manual y muéstrelo usando ShowDialog.

+0

Sé que la pregunta es antigua, pero actualmente todas las otras respuestas son incorrectas. Una pregunta con 10k visitas necesita una respuesta correcta. –

Cuestiones relacionadas