59 votes

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 du TaskBar L'heure de l'horloge de Windows.

Comment puis-je trouver l'emplacement du coin inférieur droit 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;

126voto

Klaus78 Points 3835

Ce code fonctionne pour moi dans WPF à la fois avec un affichage de 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;
 }

En bref, j'utilise

System.Windows.SystemParameters.WorkArea

au lieu de

System.Windows.Forms.Screen.PrimaryScreen.WorkingArea

0 votes

Fonctionne parfaitement sous Win7.

8 votes

Merci, ça marche pour moi. J'ajoute ce commentaire pour les novices de WPF comme moi : public MainWindow() { InitializeComponent(); this.Loaded += new RoutedEventHandler(Window_Loaded); } c'est ainsi qu'il faut l'appeler.

11voto

Amittai Shapira Points 2101

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

Votre fenêtre WPF a Top y Left ainsi que Width y Height Vous pouvez donc définir ces propriétés par rapport à l'emplacement du bureau.

0 votes

Cela fonctionne bien dans l'application Windows forms mais ne fonctionne pas correctement dans mon application WPF (la fenêtre sort du bureau), où est mon erreur ? (j'ai édité ma question).

0 votes

Je viens de créer un exemple d'application WPF avec le code que vous avez posté dans votre édition et cela fonctionne parfaitement pour moi (sur WIN7).

1 votes

J'ai trouvé pourquoi cela arrive, dans Panneau de contrôle \Appearance et la personnalisation \Display J'ai défini mon affichage à 125% ; si je le modifie à 100%, ce code sera correct dans WPF également, mais comment puis-je le faire dans WPF sans modifier mon affichage ?

4voto

Glenn Slayden Points 1995

Vous pouvez utiliser la fonction SizeChanged au lieu de Loaded si vous voulez que la fenêtre Restez sur dans le coin lorsque sa taille change. Ceci est particulièrement pratique si la fenêtre a Window.SizeToContent fixé à une valeur autre que SizeToContent.Manual dans ce cas, il s'adaptera 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 y ActualHeight (au lieu de Width y Height comme indiqué dans d'autres réponses) pour gérer un plus grand nombre de situations possibles, par exemple le passage d'une situation à l'autre. SizeToContent au moment de l'exécution.

3voto

Cyclion Points 91

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

1voto

George Hahn Points 11

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, les paramètres top et left placent cette fenêtre sous le menu de la fenêtre principale (transmis à DisplayMessage dans le premier paramètre) ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X