2010-06-25 20 views
38

De acuerdo con la documentación de MSDN para la WindowStartupLocation Property:¿Cómo puedo maximizar la ventana de WPF en la pantalla con el cursor del mouse?

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

Aunque el doc MSDN para la CenterScreen Field sí mismo lo define algo 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 de este trabajo como debería:

MainWindow.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> 

MainWindow.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 probar esto en un doble monitor, puede ver que la nueva ventana se centrará en la pantalla donde está el cursor del mouse cuando hace 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 se maximizará en la pantalla desde la que inició la aplicación. Cambiar el controlador de eventos Button_Click a la 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 sólo maximizará en la pantalla desde la que se inicia la aplicación, sin importar donde el cursor del ratón es cuando se hace clic en el botón . Si configura el estado de la ventana como maximizado después de lo 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 la maximización de la ventana después de demostrar que se necesita mucho más tiempo y en una aplicación como la mía, la ventana necesita pasar por el lugar de inmediato.

¿Alguien sabe de una solución?

Respuesta

36

me hizo la misma pregunta en el foro de MSDN y WPF tiene una respuesta con this awesome workaround:

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 presentado una bug report acerca de este problema a Microsoft que están revisando actualmente.

5

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

+0

Realmente necesita hacer ** ambas ** esas cosas. Por favor, mira mi respuesta para asegurarte. +1 de todos modos. –

69

Se puede establecer en XAML

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

Es necesario establecer SizeToContent a manual. Ver otras respuestas para más detalles.

3

Comenzando con la maximización de la ventana se puede lograr con la siguiente adición al marcado XAML.

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

La propiedad WindowState está subordinado a SizeToContent, lo que significa que es necesario establecer este último manual (si lo desea la maximización real). También puede establecer SizeToContent a altura o anchura (si desea maximizar la ventana en una dimensión, mientras que obedecer el tamaño calculado sobre la base de los tamaños de los diversos controles en el otro).

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

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

Cuestiones relacionadas