web-dev-qa-db-fra.com

Comment définir l'emplacement de la fenêtre WPF dans le coin inférieur droit du bureau?

Je veux afficher ma fenêtre au-dessus de l'horloge de TaskBar au démarrage de la fenêtre.

Comment puis-je trouver l'emplacement en bas à droite de mon bureau?

J'utilise ce code qui fonctionne bien dans l'application Windows Forms mais ne fonctionne pas correctement dans WPF:

var desktopWorkingArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
this.Left = desktopWorkingArea.Right - this.Width;
this.Top = desktopWorkingArea.Bottom - this.Height;
51
VirtualWorld

Ce code fonctionne pour moi dans WPF avec Display 100% et 125%

 private void Window_Loaded(object sender, RoutedEventArgs e)
 {
    var desktopWorkingArea = System.Windows.SystemParameters.WorkArea;
    this.Left = desktopWorkingArea.Right - this.Width;
    this.Top = desktopWorkingArea.Bottom - this.Height;
 }

Bref j'utilise

System.Windows.SystemParameters.WorkArea

au lieu de

System.Windows.Forms.Screen.PrimaryScreen.WorkingArea

104
Klaus78

Pour accéder au rectangle du bureau, vous pouvez utiliser la propriété Classe d'écran - Screen.PrimaryScreen.WorkingArea Est le rectangle de votre bureau.

Votre fenêtre WPF possède les propriétés Top et Left ainsi que Width et Height, vous pouvez donc définir ces propriétés par rapport à l'emplacement du bureau.

10
Amittai Shapira

Vous pouvez utiliser l'événement SizeChanged de la fenêtre au lieu de Loaded si vous souhaitez que la fenêtre rester dans le coin lorsque sa taille change. C'est particulièrement pratique si la fenêtre a Window.SizeToContent défini sur une valeur autre que SizeToContent.Manual; dans ce cas, il s'ajustera pour s'adapter au contenu tout en restant dans le coin.

public MyWindow()
{
    SizeChanged += (o, e) =>
    {
        var r = SystemParameters.WorkArea;
        Left = r.Right - ActualWidth;
        Top = r.Bottom - ActualHeight;
    };
    InitializeComponent();
}

Notez également que vous devez soustraire ActualWidth et ActualHeight (au lieu de Width et Height comme indiqué dans certaines autres réponses) pour gérer plus de situations possibles, par exemple basculer entre les modes SizeToContent lors de l'exécution.

4
Glenn Slayden

Mon code:

MainWindow.WindowStartupLocation = WindowStartupLocation.Manual;

MainWindow.Loaded += (s, a) =>
{
    MainWindow.Height = SystemParameters.WorkArea.Height;
    MainWindow.Width = SystemParameters.WorkArea.Width;
    MainWindow.SetLeft(SystemParameters.WorkArea.Location.X);
    MainWindow.SetTop(SystemParameters.WorkArea.Location.Y);
};
3
Cyclion

J'ai résolu ce problème avec une nouvelle fenêtre contenant une étiquette nommée MessageDisplay. Le code accompagnant la fenêtre était le suivant:

public partial class StatusWindow : Window
{
    static StatusWindow display;

    public StatusWindow()
    {
        InitializeComponent();
    }

    static public void DisplayMessage( Window parent, string message )
    {
        if ( display != null )
            ClearMessage();
        display = new StatusWindow();
        display.Top = parent.Top + 100;
        display.Left = parent.Left + 10;
        display.MessageDisplay.Content = message;
        display.Show();
    }

    static public void ClearMessage()
    {
        display.Close();
        display = null;
    }
}

Pour mon application, le réglage de haut et de gauche place cette fenêtre sous le menu de la fenêtre principale (passée à DisplayMessage dans le premier paramètre);

1
George Hahn

Ces solutions ci-dessus ne fonctionnaient pas entièrement pour ma fenêtre - elle était trop basse et la partie inférieure de la fenêtre était sous la barre des tâches et sous l'espace de travail du bureau. Je devais définir la position après le rendu du contenu de la fenêtre:

private void Window_ContentRendered(object sender, EventArgs e)
{
    var desktopWorkingArea = System.Windows.SystemParameters.WorkArea;
    this.Left = desktopWorkingArea.Right - this.Width - 5;
    this.Top = desktopWorkingArea.Bottom - this.Height - 5;
}

De plus, une partie du cadre était hors de vue, j'ai donc dû régler par 5. Je ne sais pas pourquoi cela est nécessaire dans ma situation.

0
PIntag