2009-06-03 31 views
56

creo una nueva forma y llamar desde el formulario principal de la siguiente manera:Mostrar un formulario secundario en el centro de la forma de los padres en C#

loginForm = new SubLogin(); 
loginForm.Show(); 

necesito para mostrar el formulario niño en el centro de la matriz. Así, en la carga de formulario secundario que hago las SS: `

Point p = new Point(this.ParentForm.Width/2 - this.Width/2, this.ParentForm.Height/2 - this.Height/2); 
this.Location = p; 

pero esto es un error de lanzamiento como forma parental es nulo. Traté de establecer la propiedad Parent también, pero no ayudé. ¿Alguna entrada en esto?

+0

¿Qué error estás obteniendo? – Joseph

Respuesta

113

Probar:

loginForm.StartPosition = FormStartPosition.CenterParent; 
loginForm.ShowDialog(this); 

Por supuesto, el niño por ahora ser una forma de bloqueo (de diálogo) de la ventana padre, si es que no se desea a continuación, basta con sustituir ShowDialog con Show ..

loginForm.Show(this); 

Sin embargo, aún deberá especificar la posición de inicio.

+12

También puede establecer esa propiedad de LoginForm en el diseñador. –

+37

loginForm.StartPosition = FormStartPosition.CenterParent plus loginForm.Show (this); no centra la forma. – Pedro77

2

En el Formulario de SubLogin me expondría a un método setLocation de manera que se puede establecer a partir de su forma original:

public class SubLogin : Form 
{ 
    public void SetLocation(Point p) 
    { 
     this.Location = p; 
    } 
} 

Luego, a partir de su forma principal:

loginForm = new SubLogin(); 
Point p = //do math to get point 
loginForm.SetLocation(p); 
loginForm.Show(); 
11

Asumiendo que su código es ejecutándose dentro de su formulario principal, entonces algo como esto es probablemente lo que está buscando:

loginForm = new SubLogin(); 
loginForm.StartPosition = FormStartPosition.CenterParent 
loginForm.Show(this); 

Para el registro, también hay una función Form.CenterToParent(), si necesita centrarla después de la creación por cualquier razón también.

0

El padre probablemente aún no está configurado cuando está intentando acceder a él.

Prueba esto:

loginForm = new SubLogin(); 
loginForm.Show(this); 
loginForm.CenterToParent() 
+2

CenterToParent no es un método público. Necesita delegar este método como un método público de su control. – Jarek

4

Esto es necesario:

reemplazarme con this.parent, pero es necesario configurar los padres antes de mostrar esa forma.

Private Sub ÜberToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ÜberToolStripMenuItem.Click 

     'About.StartPosition = FormStartPosition.Manual ' !!!!! 
     About.Location = New Point(Me.Location.X + Me.Width/2 - About.Width/2, Me.Location.Y + Me.Height/2 - About.Height/2) 
     About.Show() 
    End Sub 
13

Parece haber una confusión entre "Padre" y "Propietario". Si abre un formulario como formulario MDI, es decir, incrustado dentro de otro formulario, esta forma circundante es el Padre. La propiedad de formulario StartPosition con el valor FormStartPosition.CenterParent hace referencia a esta. El parámetro que puede pasar al método Show es el Propietario, ¡no el Padre! Esta es la razón por la cual frm.StartPosition = FormStartPosition.CenterParent no funciona como puede esperar.

El siguiente código colocado en un formulario lo centrará con respecto a su propietario con algún desplazamiento, si su Posición de inicio se establece en Manual. El pequeño desplazamiento abre los formularios en mosaico. Esta es una ventaja si el propietario y el formulario propiedad tienen el mismo tamaño o si abre varios formularios propios.

protected override void OnShown(EventArgs e) 
{ 
    base.OnShown(e); 
    if (Owner != null && StartPosition == FormStartPosition.Manual) { 
     int offset = Owner.OwnedForms.Length * 38; // approx. 10mm 
     Point p = new Point(Owner.Left + Owner.Width/2 - Width/2 + offset, Owner.Top + Owner.Height/2 - Height/2 + offset); 
     this.Location = p; 
    } 
} 
+0

Estoy bastante seguro de que 'CenterParent' también funciona en relación con' Owner', al menos con la versión de .net que estoy usando. – binki

7

Al poner en marcha una forma dentro de una forma MDIForm que tendrá que utilizar en lugar de .CenterScreen.CenterParent.

FrmLogin f = new FrmLogin(); 
f.MdiParent = this; 
f.StartPosition = FormStartPosition.CenterScreen; 
f.Show(); 
-4

¿Por qué no utilizar esto?

LoginForm.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner 

(vb.net)

0

Hacer un formulario Windows, a continuación, poner la opción para ello: CenterParent continuación, utilizar este código:

yourChildFormName x = new yourChildFormName(); 
x.ShowDialog(); 
0

Si desea calcular su propia ubicación, a continuación, primer set StartPosition-FormStartPosition.Manual:

Form Child = new Form(); 
Child.StartPosition = FormStartPosition.Manual; 
Child.Location = new Point(Location.X + (Width - Child.Width)/2, Location.Y + (Height - Child.Height)/2); 
Child.Show(this); 

Cuando este es el principal/padre de m, al igual que Location.X.

El valor predeterminado para StartPosition es FormStartPosition.CenterParent y, por lo tanto, cambia la ubicación del elemento secundario después de mostrarse.

+0

Esta respuesta funciona para mí. Gracias. –

0

Si tiene que centrar su childForm, desde childForm, el código será algo así. Este es el código de los childForm.cs

this.Show(parent as Form); // I received the parent object as Object type 
this.CenterToParent(); 
5

El ajuste de los padres no funciona para mí, si yo uso form.ShowDialog();.

Al usar form.Show(); o form.Show(this); no funcionó nada hasta que usé, this.CenterToParent();. Acabo de poner eso en el Load método del formulario. Todo es bueno.

La posición de inicio en el centro de los elementos primarios se configuró y funciona cuando se usa el diálogo de bloqueo showdialog.

2
childform = new Child(); 
childform.Show(this); 

En carga ChildForm caso

this.CenterToParent(); 
0

Puede configurar el StartPosition en al constructor del formulario secundario para que todos los nuevos casos de la forma quedan centrados a su padre:

public MyForm() 
{ 
    InitializeComponent(); 

    this.StartPosition = FormStartPosition.CenterParent; 
} 

Por supuesto, también puede establecer la propiedad StartPosition en las propiedades del Diseñador para su formulario secundario. Cuando se desea mostrar el formulario secundario como un cuadro de diálogo modal, acaba de establecer el propietario ventana en el parámetro para el método ShowDialog:

private void buttonShowMyForm_Click(object sender, EventArgs e) 
{ 
    MyForm form = new MyForm(); 
    form.ShowDialog(this); 
} 
2

Funciona en todos los casos, intercambiar Form1 para el formulario principal.

Popup popup = new Popup(); 
popup.StartPosition = System.Windows.Forms.FormStartPosition.Manual; 
popup.Location = new System.Drawing.Point((Form1.ActiveForm.Location.X + Form1.ActiveForm.Width/2) - (popup.Width/2),(Form1.ActiveForm.Location.Y + Form1.ActiveForm.Height/2) - (popup.Height/2)); 
popup.Show(Form1.ActiveForm); 
Cuestiones relacionadas