2009-01-14 18 views
6

Mi ventana principal ha engendrado una ventana secundaria que se coloca en la parte superior para que parezca parte de la ventana principal. Me gustaría mover la ventana secundaria en sincronización con la principal, pero no estoy seguro de cómo.Mover dos ventanas WPF a la vez?

Mi ventana principal tiene mi propia barra de título cuyo caso MouseLeftButtonDown llama a esta función:

public void DragWindow(object sender, MouseButtonEventArgs args) 
{ 
    DragMove(); 
    UpdateChildWindowPosition(); 
} 

Esto se traduce en DragMove() se ejecuta en la ventana principal se mueve la ventana principal solo como me arrastre la barra de título. UpdateChildWindowPosition() no se ejecuta hasta que suelte el mouse en el que lee algunas coordenadas de elementos y establece la posición de la ventana secundaria; verá que la ventana secundaria se ajusta a la ubicación que no se desea.

¿Cómo puedo hacer que la ventana secundaria se mueva en sincronización con la ventana principal?

Respuesta

5

AH HAH!

Mi ventana principal tiene un evento LocationChanged que he vinculado a mi UpdateChildWindowPosition(). LocationChange se activa cuando (duh) la ubicación cambia, por lo que se activa continuamente a medida que muevo la ventana cuando DragMove() se está ejecutando en mi DragWindow publicada anteriormente.

3

Puede usar las propiedades izquierda y superior de la ventana para colocar la ventana secundaria. Aquí está un poco duro de código como un ejemplo:

En el código MainWindow:

 mDebugWindow.Left = this.Left + this.ActualWidth; 
     mDebugWindow.Top = this.Top; 

En este caso mDebugWindow es la ventana de mi hijo. Este código le dice que se siente en el lado derecho de la ventana principal, con las partes superiores de las ventanas alineadas.

Espero que esto ayude.

+1

Gracias, esto es similar al código en mi UpdateChildWindowPosition(). Funciona, sin embargo, no funciona en tiempo real, ya que arrastro mi ventana principal. Solo se ejecuta cuando suelto mi arrastre, lo que provoca que la segunda ventana permanezca estacionaria, ya que la arrastro y la coloco en su lugar cuando la suelto. – Jippers

0

¿Puede exponer un método DragMove() para el formulario "secundario"? Entonces solo llámalo del padre?

public void DragWindow(object sender, MouseButtonEventArgs args) 
{ 
    DragMove(); 
    UpdatePosition(); 

    childForm.DragMove(); 
    childForm.UpdatePosition(); 
} 

o si usted está usando la posición del ratón para determinar dónde mover el formulario, hacer los mismos cálculos en su DragMove método actual() y cambie la propiedad Form.Location de su formulario hijo también?

+0

Lo siento, no estaba más claro. He actualizado mi pregunta. DragMove() es una llamada de función WPF incorporada para mover la ventana en la que estoy arrastrando.Se sigue ejecutando hasta que suelte el arrastre, al que se llama UpdatePosition y ajusta la ventana secundaria a una ubicación. – Jippers

0

Esto es lo que hice:

puse primero una instancia de la matriz, como el propietario de la ventana secundaria, (hacer un ejemplo, estableciendo que en la clase MainWindow public static MainWindow instance; continuación instance = this;):

public ChildWindow() 
{ 
    Owner = MainWindow.instance; 
    InitializeComponent(); 
} 

Luego agregar un controlador de eventos en la clase padre para disparar cuando el padre está en movimiento:

public MainWindow() 
{ 
    InitializeComponent(); 
    LocationChanged += new EventHandler(Window_LocationChanged); 
} 

Ahora bucle a través de todo el w las sombras se debieron a MainWindow para restablecer su margen:

private void Window_LocationChanged(object sender, EventArgs e) 
{ 
    foreach (Window win in this.OwnedWindows) 
    { 
     win.Top = this.Top + ((this.ActualHeight - win.ActualHeight)/2); 
     win.Left = this.Left + ((this.ActualWidth - win.ActualWidth)/2); 
    } 
} 
Cuestiones relacionadas