Establezca WindowStartupLocation en Margin.Top of Button1 de la ventana principal

Estoy trabajando en un proyecto en el que tengo que agregar un pequeño panel de vista previa y un cuadro "Acerca de" cada vez que un usuario coloca el cursor sobre los botones de la ventana principal.

Para el ejemplo: tengo una ventana - preview.xaml, y mi ventana principal se llama MainWindow.xaml.

¿Cómo configuro la parte inferior de la ventana de vista previa para que aparezca en la parte superior del botón 1 en la ventana principal?

Intenté algo como esto sin suerte:

public preview()
{
   InitializeComponent();
   this.WindowStartupLocation = WindowStartupLocation.Manual;
   Top = mainWindow.button1.Margin.Top;
}

Espero que mis divagaciones tengan algún sentido ...

¡Cualquier ayuda es muy apreciada!

preguntado el 08 de noviembre de 11 a las 12:11

Un par de preguntas: ¿Dónde está el código que muestra la vista previa? Que valor tiene mainWindow.button1.Margin.Top realmente tiene? ¿Dónde aparece realmente su ventana en relación con el lugar donde desea que aparezca? -

El código que muestra la vista previa es durante un evento MouseEnter en MainForm que es solo: preview.show () ;. La ventana de vista previa aparece actualmente en la parte superior, muy a la izquierda. -

2 Respuestas

Necesitas configurar Left y Top propiedades de la ventana a las coordenadas de la pantalla, los márgenes de los botones no ayudarán aquí. Usar PointToScreen función para obtener las coordenadas de pantalla de sus botones:

    private void button1_MouseEnter(object sender, MouseEventArgs e)
    {
        var control = ((FrameworkElement)sender);
        // get screen coordinates of (0,0) point of button
        var location = control.PointToScreen(new Point(0, 0));
        var w = new preview()
        {
            WindowStartupLocation = System.Windows.WindowStartupLocation.Manual,
            ShowActivated = false,
        };
        w.Top = location.Y - w.Height;
        w.Left = location.X + (control.ActualWidth - w.Width) / 2;
        w.Show();
    }

respondido 08 nov., 11:16

¡Dulce! Esto es exactamente lo que estoy buscando. ¡Gracias Señor! - RobinNilsson

Tienes que hacerlo al revés. En su MainWindow donde abre la ventana de vista previa, haga algo como esto:

PreviewWindow preview = new PreviewWindow
{
     Owner = this,
     WindowStartupLocation = WindowStartupLocation.Manual,
     Top = button1.Margin.Top
};
preview.Show();

Si desea reutilizar esa ventana, debe hacer un poco de lógica.

respondido 08 nov., 11:16

hmm, la ventana todavía se abre en la parte superior de la pantalla hacia la izquierda. Si cambio 'Top = button1.Margin.Top' a 'Top = button1.Margin.Bottom', la ventana se verá un poco más a la derecha. - RobinNilsson

@RobinNilsson: Ah, me perdí ese punto. Tienes que obtener las coordenadas absolutas de la pantalla. Puede obtener las coordenadas de la pantalla con PointToScreen(new Point(button.Margin.Left, button.Margin.Top)); - Fischermaen

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.