2010-08-10 15 views
43

Bien this pregunta y this pregunta son similares, pero no hay respuestas que funcionen. De hecho, esperaba que WindowStartupLocation = CenterOwner funcionara ... no es así. Parece centrar la nueva ventana en el centro de una columna de cuadrícula, no en el centro de la ventana principal. Entonces asumo que piensa que es el padre. En segundo lugar, cuando cierro el diálogo y lo vuelvo a abrir, no está centrado, sino que se mueve hacia abajo y hacia la derecha desde la posición anterior. Y si muevo la ventana principal a un segundo monitor, la ventana emergente se abre en el monitor predeterminado. ¿Estas propiedades están equivocadas o solo estoy pensando que debería funcionar de otra manera? Supongo que podría calcular las propiedades Superior e Izquierda manualmente. Solo quiero que la ventana emergente esté centrada en la ventana principal, sin importar dónde esté.WPF WindowStartupLocation = "CenterOwner" no es realmente el centro, y aparece por todas partes, ¿por qué?

Respuesta

66

Probablemente porque no configuró el propietario:

this.Owner = App.MainWindow; // for example 

Eso es como lo hago y se centra la ventana perfectamente todo el tiempo.

Extender sobre lo que va a Eddins comentado, se puede crear un método de sobrecarga para ShowDialog() o Mostrar() en su ventana:

public void ShowDialog(Window owner) 
{ 
    this.Owner = owner; 
    this.ShowDialog(); 
} 

public void Show(Window owner) 
{ 
    this.Owner = owner; 
    this.Show(); 
} 

o sobrecargar un constructor:

public MyWindow(Window owner) 
    : this() 
{ 
    this.Owner = owner; 
} 
+5

Como alternativa, configure al propietario antes de llamar a '.Show()' o '.ShowDialog()' en la ventana: 'window.Owner = this;' –

+0

Doh, tiene que estar bromeando. Eso me ha mordido antes en winforms. Maldita cosa. ¿No puedes incumplir tu propietario a quien alguna vez te haya creado una instancia? – nportelli

+0

Haha podrías crear una sobrecarga de constructor que tome al propietario, añadiré un ejemplo en la respuesta. – Carlo

5

Si usted crea una extensión para esto, puede reutilizar esta buena idea:

/// <summary> 
/// Opens a window modally, with an owner 
/// </summary> 
/// <param name="window">The window to open</param> 
/// <param name="opener">The owner of the window getting opened</param> 
/// <returns>window.ShowDialog()</returns> 
public static bool? ShowDialog(this Window window, Window opener) 
{ 
    window.Owner = opener; 
    return window.ShowDialog(); 
} 
0

Tuve el mismo problema Lem ... pero fue principalmente debido al hecho de que, cuando quise deshacerme de la ventana hija, usé hide() en lugar de close() ... así que cuando la vuelvas a abrir, porque estaba oculta y no cerrada, cuando el ventana principal se mueve, todavía se abre en su ubicación de inicio ...

Así que cuando cierre la ventana secundaria en lugar de ocultarla, por ejemplo, cuando termine de trabajar con ella.

Cuestiones relacionadas