Question

Selon la documentation MSDN pour la propriété WindowStartupLocation :

  

Réglage CenterScreen provoque une fenêtre pour être positionné au centre de l'écran qui contient le curseur de la souris.

Bien que le doc MSDN pour le CenterScreen champ lui-même le définit un peu moins clairement:

  

L'emplacement de démarrage d'une fenêtre est le centre de l'écran sur lequel il est ouvert.

A montre des tests simples ce travail comme il se doit:

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 vous testez cela sur un système à double écran, vous pouvez voir que la nouvelle fenêtre sera centrée sur l'écran où le curseur de la souris est lorsque vous cliquez sur le bouton. C'est exactement comment il devrait travail.

Cependant , si vous essayez de définir la fenêtre pour maximiser avant de le montrer, la nouvelle fenêtre ne maximiser l'affichage à partir de laquelle vous avez lancé l'application. Changer le gestionnaire d'événements Button_Click à ce qui suit pour voir ce que je veux dire:

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

Maintenant, la fenêtre ne maximiser sur l'écran à partir de laquelle l'application est lancée, peu importe où le curseur de la souris est lorsque vous cliquez sur le bouton. Si vous définissez l'état de fenêtre maximisée après vous le montrer, CenterScreen fonctionne correctement. Cela équivaut à l'utilisateur maximiser la fenêtre. Par exemple:

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

Le problème ici, bien sûr, est que maximiser la fenêtre après avoir montré qu'il faut beaucoup plus de temps et dans une application telle que la mienne, les besoins de la fenêtre de pop en place immédiatement.

Quelqu'un sait d'une solution?

Était-ce utile?

La solution 2

J'ai posé la même question sur le forum MSDN WPF et a obtenu une réponse avec cette solution de contournement impressionnant :

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();
}

J'ai également présenté un bug rapport sur ce problème à Microsoft qu'ils examinent actuellement.

Autres conseils

Vous pouvez définir dans XAML

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

Vous devez définir SizeToContent Manuel . Voir d'autres réponses pour plus de détails.

Assurez-vous que SizeToContent est réglé sur SizeToContent.Manual, sinon il ne fonctionnera pas.

À partir de la maximize fenêtre peut être obtenue par l'ajout suivant le balisage XAML.

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

La propriété WindowState est subordonnée à SizeToContent , ce qui signifie que vous avez besoin de mettre ce dernier Manuel (si vous le souhaitez la maximisation réelle) . Vous pouvez également définir SizeToContent Taille ou Largeur (si vous souhaitez agrandir la fenêtre dans une dimension, alors obéissant à la taille calculée à partir de la les tailles de contrôles dans l'autre).

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

Ce qui précède fera la durée de la fenêtre de haut en bas, mais pas nécessairement de gauche à bord droit. Il est équivalent à appuyer sur la combinaison de touches Win + Maj + Up .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top