WindowStartupLocation = WindowStartupLocation.CenterScreen 无法正常工作[关闭]

问题描述 投票:0回答:2

窗口属性: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();
    }

我做错了什么吗?请给我一个建议,提前谢谢

c# wpf
2个回答
3
投票

您可能正在尝试创建一个比屏幕大的窗口。即使您的 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 手动计算矩形。


0
投票

MainWindow 可能没有设置 Owner;尝试在 XAML 或代码中设置一个(或者按照 Jackdaw 的建议,将其更改为

CenterScreen
)。

或者,您的屏幕截图看起来窗口对于屏幕来说太大; Windows 可能会将其放置在比屏幕正中央更有用的位置(例如,访问标题栏)。我没有检查过,所以无法验证。

© www.soinside.com 2019 - 2024. All rights reserved.