Подтвердить что ты не робот

Как установить расположение окна WPF в нижнем правом углу рабочего стола?

Я хочу показать свое окно поверх часов TaskBar при запуске окон.

Как найти нижний правый угол моего рабочего стола?

Я использую этот код, который хорошо работает в приложении Windows Form, но не работает корректно в WPF:

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

Ответ 1

Этот код работает для меня в WPF с дисплеем 100% и 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;
 }

Вкратце я использую

System.Windows.SystemParameters.WorkArea

вместо

System.Windows.Forms.Screen.PrimaryScreen.WorkingArea

Ответ 2

Чтобы получить доступ к прямоугольнику рабочего стола, вы можете использовать Класс экрана - Screen.PrimaryScreen.WorkingArea свойство - это прямоугольник вашего рабочего стола.

В окне WPF есть свойства Top и Left, а также Width и Height, поэтому вы можете установить эти свойства относительно местоположения рабочего стола.

Ответ 3

Мой код:

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

Ответ 4

Вы можете использовать окно SizeChanged вместо Loaded, если вы хотите, чтобы окно оставалось в углу при изменении его размера. Это особенно удобно, если в окне Window.SizeToContent установлено значение, отличное от SizeToContent.Manual; в этом случае он будет корректироваться, чтобы соответствовать содержимому, оставаясь в углу.

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

Обратите внимание, что вы должны вычесть ActualWidth и ActualHeight (вместо Width и Height, как показано в некоторых других ответах), чтобы обрабатывать более возможные ситуации, например, переключение между режимами SizeToContent во время выполнения.

Ответ 5

Я решил эту проблему в новом окне, содержащем метку MessageDisplay. Код, сопровождающий окно, был следующим:

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

Для моего приложения настройка верхнего и левого окна помещает это окно под меню в главном окне (передается в DisplayMessage в первом параметре);

Ответ 6

Это решение не полностью работало для моего окна - оно было слишком низким, а нижняя часть окна находилась под панелью задач и под рабочим пространством рабочего стола. Мне нужно было установить позицию после визуализации содержимого окна:

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

Кроме того, часть фрейма была вне поля зрения, поэтому мне пришлось настроить ее на 5. Не знаю, почему это необходимо в моей ситуации.