窗口属性:WindowStartupLocation = WindowStartupLocation.CenterScreen 效果不佳。 我在 XAML 和 XAML.cs 中更改了此属性,但窗口在运行时并未位于屏幕中央。 这是 XAML 中的代码:
Title="MainWindow" Height="1080" Width="1920" WindowStyle="None" WindowStartupLocation="CenterOwner" ResizeMode="NoResize" AllowsTransparency="True"
这是XAML.cs中的代码
public MainWindow()
{
WindowStartupLocation = WindowStartupLocation.CenterScreen;
InitializeComponent();
}
您可能正在尝试创建一个比屏幕大的窗口。即使您的 LCD 具有 1920x1080 像素,任务栏通常也会占用一些高度,而且您的 DPI 缩放比例也可能 > 100%。 WPF 的大小单位不是像素,而是 DPI 虚拟化单位。要检查或更改 DPI 缩放,请右键单击桌面上的空白区域,“显示设置”、“缩放和布局”、“更改文本、应用程序和其他项目的大小”。
另一个可能的原因是每个显示器的 DPI 感知。在某些多显示器系统上,这些尺寸单位取决于包含窗口中心的显示器,并且缩放比例会随着窗口的移动而动态变化。在这样的系统上将 WPF 窗口居中或最大化相对困难,并且 WPF 框架存在 Microsoft 忽略修复的已知错误。如果是这种情况,请使用 WinAPI 或 win.forms 中更好的 Screen.AllScreens 查询桌面几何形状,然后在 OnSourceInitialized 方法中调用
MoveWindow
WinAPI 来定位窗口。 Screen.AllScreens
和 MoveWindow
WinAPI 使用相同的大小单位,它们也不是像素,但至少两者之间是一致的,即应该可以工作(WPF 的坐标缩放通常不同)。以下是如何使用 WinAPI 定位 WPF 窗口:
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
static class WindowExt
{
// http://www.pinvoke.net/default.aspx/user32.movewindow
[DllImport( "user32.dll", SetLastError = true )]
static extern bool MoveWindow( IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint );
public static void moveWindow( this Window window, Rectangle rect )
{
var wih = new WindowInteropHelper( window );
IntPtr hWnd = wih.Handle;
MoveWindow( hWnd, rect.Left, rect.Top, rect.Width, rect.Height, false );
}
}
您需要从 Screen.WorkingArea 手动计算矩形。
MainWindow 可能没有设置 Owner;尝试在 XAML 或代码中设置一个(或者按照 Jackdaw 的建议,将其更改为
CenterScreen
)。
或者,您的屏幕截图看起来窗口对于屏幕来说太大; Windows 可能会将其放置在比屏幕正中央更有用的位置(例如,访问标题栏)。我没有检查过,所以无法验证。