
[英]How to minimize the WPF application into the bottom right corner of desktop?
[英]How to set the location of WPF window to the bottom right corner of desktop?
我想在窗口启动时在TaskBar
的时钟顶部显示我的窗口。
如何找到桌面右下角的位置?
我使用此代码在 windows 窗体应用程序中运行良好,但在 WPF 中无法正常运行:
var desktopWorkingArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
this.Left = desktopWorkingArea.Right - this.Width;
this.Top = desktopWorkingArea.Bottom - this.Height;
这段代码在 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
要访问桌面矩形,您可以使用Screen 类- Screen.PrimaryScreen.WorkingArea
属性是桌面的矩形。
您的 WPF 窗口具有Top
和Left
属性以及Width
和Height
,因此您可以相对于桌面位置设置这些属性。
如果您希望窗口在其大小改变时保持在角落,您可以使用窗口的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
模式之间切换。
我的代码:
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);
};
我用一个包含名为 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;
}
}
对于我的应用程序,top 和 left 的设置将这个窗口放在主窗口的菜单下方(在第一个参数中传递给 DisplayMessage);
上述解决方案并不完全适用于我的窗口 - 它太低并且窗口的底部位于任务栏下方和桌面工作区下方。 我需要在渲染窗口内容后设置位置:
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。不知道为什么在我的情况下需要这样做。
@Klaus78 的回答是正确的。 但由于这是谷歌弹出的第一件事,如果在屏幕分辨率经常变化的环境中工作,以至于您的应用程序在虚拟桌面或虚拟服务器上运行,当屏幕分辨率发生变化时,您仍然需要它来更新它的位置,我发现链接到SystemEvents.DisplaySettingsChanged 事件是有益的。 这是一个使用 rx 的示例,您可以将其放在您的构造函数中以供您查看。
Observable
.FromEventPattern<EventHandler, EventArgs>(_ => SystemEvents.DisplaySettingsChanged += _, _ => SystemEvents.DisplaySettingsChanged -= _)
.Select(_ => SystemParameters.WorkArea)
.Do(_ =>
{
Left = _.Right - Width;
Top = _.Bottom - Height;
})
.Subscribe();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.