c# - WPF 问题仅在某些硬件配置上在辅助屏幕上创建窗口
问题描述
我正在使用标准建议来创建窗口并将其显示在辅助监视器上:
我使用以下内容来获取可用的屏幕:
Screen[] availableScreens = Screen.AllScreens;
提取目标屏幕的工作区域(在我的例子中是第二个屏幕,而不是主屏幕):
secondaryScreenWorkingArea = availableScreens[1].WorkingArea;
创建窗口时,根据工作区域设置位置属性(调用 Show() 之前):
Left = secondaryScreenWorkingArea.Left;
Top = secondaryScreenWorkingArea.Top;
Width = secondaryScreenWorkingArea.Width;
Height = secondaryScreenWorkingArea.Height;
关于窗口的其他一些注意事项:
它是一个全屏窗口,旨在跨越整个第二个显示器
它不是主应用程序窗口
它在任务栏中隐藏,旨在作为主应用程序窗口的补充
WindowState = WindowState.Maximized;
ShowInTaskbar="假"
WindowStyle = WindowStyle.None;
在 Windows 10 企业版 V 1809 上运行
下面是我测试过的不同配置的概要,其中只有一个行为不正确:
- 当我在具有两个 1920x1080 显示器、100% 显示缩放的工作站设置上运行它时,它按预期工作。
- 当我在具有两个 1920x1080 显示器、150% 显示缩放的工作站设置上运行它时,它按预期工作。
- 当我在连接了 1920x1080 显示器和辅助 USB 显示器 (800x480)、100% 显示缩放的工作站设置上运行它时,它可以工作
- 当我在连接了 1920x1080 显示器和辅助 USB 显示器 (800x480)、150% 显示缩放的工作站设置上运行它时,它可以工作
- 当我在 Microsoft Surface Go 上运行此程序时,主表面显示器 (1800x1200) 和连接到表面基座的辅助 USB 显示器 (800x480),100% 显示缩放,它可以工作
- 当我在 Microsoft Surface Go 上运行此程序时,主 Surface 显示器 (1800x1200) 和连接到 Surface Dock 的辅助 USB 显示器 (800x480),150% 显示缩放,它不起作用。相反,一旦 Window.Show() 被调用,这将触发窗口重新定位到主显示器(Surface Go 屏幕)。我注意到这一点是因为我在调用 Window.Show() 期间收到了窗口的 LocationChanged 事件,并且看到 Width 和 Height 属性已更新为 Surface Go 显示器的大小 (1800x1200)。但是,奇怪的是,即使窗口移动了,Top 和 Left 属性也不会更新。
从上面的案例可以看出,这似乎是 Display scaling + Surface Go 的问题。在我的工作站上,我强制使用与 Surface Go 相同的分辨率(1800x1200)并将显示缩放设置为 150%,但无法复制 Surface Go 的问题
此外,我对另一台分辨率稍高 (1024x600) 的 USB 显示器进行了一些测试,发现同样的问题仅在 Surface Go 上出现,但这一次需要我在问题开始之前将显示缩放比例推至 200%在该配置中发生。
我尝试了几件事,但都没有为这个问题提供任何解决方案:
尝试了 dpiAware 和 dpiAwareness 的各种配置。这些改变了我在抓取可用屏幕时收到的坐标的缩放比例,但是使用缩放/未缩放的坐标对这个问题没有影响
更改显示缩放选项后重新启动 Surface Go(根据“显示设置”中显示的“某些应用程序在您登录之前不会响应缩放更改”消息
尝试在 Loaded 事件之前和之后设置 WindowState = WindowState.Maximized 并且都产生了相同的结果。
任何尝试的帮助或其他想法将不胜感激,不确定这是 WPF、Windows 10 还是 Microsoft Surface Go 问题。
解决方案
推荐阅读
- r - 我无法突然打开ggplot2
- python - 选择 Tensorflow 网络配置。新手问题
- javascript - 在嵌套对象中正确字符串化 JSON
- javascript - 有没有办法知道什么叫做我的 HTML 页面
- python - 使用 Autokeras 在 Keras 回调函数中获取试用号
- r-markdown - MS Word 中的 Bookdown 自定义块 (word_document2)
- python - 如何找出 Python 文件 read() 方法在文件中的哪个位置失败?(ValueError:int() 的无效文字,基数为 10:)
- github - 将 Jenkins 与将 MFA 配置到 github 帐户的 Github 集成
- javascript - Chart.js 3.3.0 和 destory() 的 React 问题
- unity3d - 如何从 Autodesk Forge AR / VR Toolkit 中获取 DbID 以过滤场景