wake-up-neo.com

Wie lege ich die Position des WPF-Fensters in der unteren rechten Ecke des Desktops fest?

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;
51
VirtualWorld

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

104
Klaus78

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.

10
Amittai Shapira

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.

4
Glenn Slayden

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

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

1
George Hahn

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.

0
PIntag