¿Cómo puedo maximizar una ventana WPF en la pantalla con el cursor del ratón?


De acuerdo con la documentación de MSDN para la propiedad WindowStartupLocation :

Al configurar CenterScreen se coloca una ventana en el centro de la pantalla que contiene el cursor del ratón.

Aunque el documento MSDN para el Campo CenterScreen en sí mismo lo define un poco menos claramente como:

La ubicación de inicio de una ventana es el centro de la pantalla en la que se abre.

Una prueba simple muestra esto trabajando como debería:

Ventana principal.xaml

<Window x:Class="CenterScreenTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Button Click="button_Click">Open Window</Button>
</Window>

Ventana principal.XAML.cs

using System.Windows;

namespace CenterScreenTest
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        void button_Click(object sender, RoutedEventArgs e)
        {
            Window window = new Window();
            window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            window.Show();
        }
    }
}

Si prueba esto en un sistema de doble monitor, puede ver que la nueva ventana se centrará en la pantalla donde está el cursor del ratón cuando haga clic en el botón. Así es exactamente como debería funcionar.

Sin embargo, si intenta configurar la ventana para maximizar antes de mostrarla, la nueva ventana solo maximizará en la pantalla desde la que lanzó la aplicación. Cambie el controlador de eventos button_Click a lo siguiente para ver lo que quiero decir:

void button_Click(object sender, RoutedEventArgs e)
{
    Window window = new Window();
    window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
    window.WindowState = WindowState.Maximized;
    window.Show();
}

Ahora la ventana solo se maximizará en la pantalla desde la que se inicia la aplicación, sin importar dónde esté el cursor del ratón cuando haga clic en el botón. Si se establece el estado de la ventana en maximizado después de se muestra, CenterScreen funciona correctamente. Esto es equivalente a que el usuario maximice la ventana. Por ejemplo:

void button_Click(object sender, RoutedEventArgs e)
{
    Window window = new Window();
    window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
    window.Show();
    window.WindowState = WindowState.Maximized;
}

El problema aquí, por supuesto, es que maximizar la ventana después de mostrar que toma mucho más tiempo y en una aplicación como la mía, la ventana debe aparecer en su lugar inmediatamente.

Alguien sabe de una solución?

Author: Eben Geer, 2010-06-26

4 answers

Puede configurarlo en XAML

<Window Height="300" Width="300" WindowState="Maximized">
</Window>

Debe establecer SizeToContent en Manual. Vea otras respuestas para más detalles.

 75
Author: Artur Michajluk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-27 09:31:20

Hice la misma pregunta en el Foro MSDN WPF y obtuve una respuesta con esta increíble solución :

void button_Click(object sender, RoutedEventArgs e)
{
    Window window = new Window();
    window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
    window.SourceInitialized += (s, a) => window.WindowState = WindowState.Maximized;
    window.Show();
}

También he enviado un informe de error sobre este problema a Microsoft que están revisando actualmente.

 37
Author: Eben Geer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-30 17:51:01

Asegúrese de que SizeToContent esté establecido en SizeToContent.Manual, de lo contrario no funcionará.

 4
Author: Tom Leibu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-24 08:05:44

Comenzando con la ventana maximize se puede lograr mediante la siguiente adición al marcado XAML.

<Window Height="300" Width="300" 
  WindowState="Maximized"
  SizeToContent="Manual">
</Window>

La propiedad WindowState está subordinada a SizeToContent, lo que significa que debe establecer este último Manual (si desea la maximización real). También puede establecer SizeToContent a Height o Width (si desea maximizar la ventana en una dimensión, mientras que obedecer el tamaño calculado en función de los tamaños de los controles en el otro).

<Window Height="300" Width="300" 
  WindowState="Maximized"
  SizeToContent="Width">
</Window>

Lo anterior hará que la ventana se extienda de arriba a abajo, pero no necesariamente de izquierda a derecha. Es equivalente a presionar la combinación de teclas Win+Shift+Up .

 2
Author: Konrad Viltersten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-27 09:34:47