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