繁体   English   中英

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

[英]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 窗口具有TopLeft属性以及WidthHeight ,因此您可以相对于桌面位置设置这些属性。

如果您希望窗口在其大小改变时保持在角落,您可以使用窗口的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模式之间切换。

我的代码:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM