Ich möchte mein Fenster über der Uhr von TaskBar
anzeigen, wenn das Fenster gestartet wird.
Wie finde ich die untere rechte Ecke meines Desktops?
Ich verwende diesen Code, der in Windows Forms-Anwendungen gut funktioniert, in WPF jedoch nicht richtig funktioniert:
var desktopWorkingArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
this.Left = desktopWorkingArea.Right - this.Width;
this.Top = desktopWorkingArea.Bottom - this.Height;
Dieser Code funktioniert bei mir in WPF sowohl mit Display 100% als auch mit 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;
}
Kurz ich benutze
System.Windows.SystemParameters.WorkArea
anstatt von
System.Windows.Forms.Screen.PrimaryScreen.WorkingArea
Um auf das Desktop-Rechteck zuzugreifen, können Sie die Screen-Klasse - Screen.PrimaryScreen.WorkingArea
-Eigenschaft verwenden, die das Rechteck Ihres Desktops ist.
Ihr WPF-Fenster verfügt über die Eigenschaften Top
und Left
sowie Width
und Height
, sodass Sie diese Eigenschaften relativ zum Desktop-Speicherort festlegen können.
Sie können das Ereignis SizeChanged
des Fensters anstelle von Loaded
verwenden, wenn das Fenster bleiben in der Ecke sein soll, wenn sich seine Größe ändert. Dies ist besonders praktisch, wenn für das Fenster Window.SizeToContent
Ein anderer Wert als SizeToContent.Manual
Festgelegt wurde. In diesem Fall passt es sich an den Inhalt an, während es in der Ecke bleibt.
public MyWindow()
{
SizeChanged += (o, e) =>
{
var r = SystemParameters.WorkArea;
Left = r.Right - ActualWidth;
Top = r.Bottom - ActualHeight;
};
InitializeComponent();
}
Beachten Sie auch, dass Sie ActualWidth
und ActualHeight
subtrahieren sollten (anstelle von Width
und Height
, wie in einigen anderen Antworten gezeigt), um beispielsweise mehr mögliche Situationen zu behandeln Zur Laufzeit zwischen den Modi SizeToContent
wechseln.
Mein 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);
};
Ich habe dieses Problem mit einem neuen Fenster gelöst, das eine Bezeichnung mit dem Namen MessageDisplay enthält. Der Code für das Fenster lautete wie folgt:
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;
}
}
Bei meiner Anwendung befindet sich dieses Fenster bei der Einstellung von oben und links unter dem Menü im Hauptfenster (im ersten Parameter an DisplayMessage übergeben).
Die obigen Lösungen funktionierten nicht vollständig für mein Fenster - es war zu niedrig und der untere Teil des Fensters befand sich unter der Taskleiste und unter dem Desktop-Arbeitsbereich. Ich musste die Position festlegen, nachdem der Fensterinhalt gerendert wurde:
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;
}
Da ein Teil des Rahmens nicht sichtbar war, musste ich ihn um 5 anpassen. Ich bin mir nicht sicher, warum dies in meiner Situation erforderlich ist.