Как установить расположение окна 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;
Ответы
Ответ 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. Не знаю, почему это необходимо в моей ситуации.