.net - ventana - que se puede hacer con wpf
¿Cómo puedo hacer una ventana WPF maximizada en la pantalla con el cursor del mouse? (4)
Asegúrese de que SizeToContent esté configurado en SizeToContent.Manual, de lo contrario no funcionará.
De acuerdo con la documentación de MSDN para la propiedad WindowStartupLocation :
La configuración de CenterScreen hace que una ventana se coloque en el centro de la pantalla que contiene el cursor del mouse.
Aunque el documento de MSDN para el propio CenterScreen Field lo define de forma algo menos clara como:
La ubicación de inicio de una ventana es el centro de la pantalla en la que se abre.
Una simple prueba muestra que esto funciona 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 prueba esto en un sistema de doble monitor, puede ver que la nueva ventana se centrará en la pantalla donde se encuentra el cursor del mouse cuando hace clic en el botón. Así es exactamente cómo debería funcionar.
Sin embargo , si intenta configurar la ventana para maximizarla antes de mostrarla, la nueva ventana solo maximizará en la pantalla desde la que inició la aplicación. Cambie el controlador de eventos button_Click a lo siguiente para ver a qué me refiero:
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 mouse cuando haga clic en el botón. Si configura el estado de la ventana a maximizado después de mostrarlo, CenterScreen funciona correctamente. Esto es equivalente al usuario que maximiza 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 mostrarla lleva mucho más tiempo y en una aplicación como la mía, la ventana debe colocarse en su lugar de inmediato.
Alguien sabe de una solución?
Comenzando con la maximización de la ventana 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 configurar el último Manual (si desea la máxima maximización real). También puede configurar SizeToContent en Altura o Ancho (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 la otra).
<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 .
Hice la misma pregunta en el foro de 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 actualmente están revisando.
Puedes configurarlo en XAML
<Window Height="300" Width="300" WindowState="Maximized">
</Window>
Necesitas configurar SizeToContent en Manual . Ver otras respuestas para más detalles.