如何将WPF窗口的位置设置为桌面的右下角?

61

我想在窗口启动时将其显示在任务栏的时钟上面。

如何找到我的桌面右下角位置?

我使用这段代码,在Windows Forms应用程序中运行良好,但在WPF中无法正确运行:

var desktopWorkingArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
this.Left = desktopWorkingArea.Right - this.Width;
this.Top = desktopWorkingArea.Bottom - this.Height;
7个回答

133

在 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


在Win7上完美运行。 - mack
9
谢谢,这对我很有帮助。我为像我一样的WPF新手添加了这个注释:public MainWindow() { InitializeComponent(); this.Loaded += new RoutedEventHandler(Window_Loaded); } 这是调用它的方法。 - equiman

11

要访问桌面矩形,您可以使用Screen类 - Screen.PrimaryScreen.WorkingArea属性是您的桌面矩形。

您的WPF窗口具有TopLeft属性以及WidthHeight属性,因此您可以相对于桌面位置设置这些属性。


这在 Windows Forms 应用程序中运行良好,但在我的 WPF 应用程序中无法正常工作(窗口超出桌面),我错在哪里?(我编辑了我的问题) - Mahdi7s
我刚刚使用您在编辑中发布的代码创建了一个示例WPF应用程序,在我的WIN7上完美运行。 - Amittai Shapira
1
我找到了为什么会发生这种情况,因为在“控制面板\外观和个性化\显示”中,我将我的显示设置为125%。如果我将其更改为100%,则此代码在WPF中将是正确的。但是,如果不更改我的显示设置,我该如何在WPF中实现呢? - Mahdi7s

6
您可以使用窗口的 SizeChanged 事件,而非 Loaded,以便在窗口大小改变时使其始终停留在角落。如果窗口将 Window.SizeToContent 设置为某个值而不是 SizeToContent.Manual,则特别方便;在这种情况下,它会根据内容调整大小,同时仍然停留在角落。
public MyWindow()
{
    SizeChanged += (o, e) =>
    {
        var r = SystemParameters.WorkArea;
        Left = r.Right - ActualWidth;
        Top = r.Bottom - ActualHeight;
    };
    InitializeComponent();
}

请注意,您应该减去 ActualWidthActualHeight(而不是其他一些答复中显示的 WidthHeight),以处理更多可能的情况,例如在运行时在 SizeToContent 模式之间切换。

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

1

我用一个名为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)。


0

上述解决方案对于我的窗口并没有完全起作用 - 它太低了,窗口的底部在任务栏下面,在桌面工作区域下面。我需要在窗口内容呈现后设置位置:

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个单位。不确定为什么在我的情况下需要这样做。


我遇到了类似的问题。顶部没问题,但我想要并排放置的两个窗口的左侧、右侧、宽度或高度都不行。 - Alex Telon

0

@Klaus78的回答是正确的。但由于这是谷歌搜索出来的第一件事,如果在屏幕分辨率经常变化的环境中工作,例如在虚拟桌面或虚拟服务器上运行应用程序,并且仍然需要在屏幕分辨率更改时更新其位置,我发现链接到SystemEvents.DisplaySettingsChanged事件是有益的。以下是一个使用rx的示例,您可以将其放在视图的构造函数中。

        Observable
            .FromEventPattern<EventHandler, EventArgs>(_ => SystemEvents.DisplaySettingsChanged += _, _ => SystemEvents.DisplaySettingsChanged -= _)
            .Select(_ => SystemParameters.WorkArea)
            .Do(_ =>
            {
                Left = _.Right - Width;
                Top = _.Bottom - Height;
            })
            .Subscribe();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接