【问题标题】:MediaElement, MediaPlayer Classes break DPI Virtualization on Windows Forms appMediaElement、MediaPlayer 类打破了 Windows 窗体应用程序上的 DPI 虚拟化
【发布时间】:2014-01-04 20:46:05
【问题描述】:

我有一个 C# .Net 4.0 Windows Forms 应用程序在 Win7 和 Win8.1 上的超高分辨率显示器上无法正确缩放字体。

在超高分辨率平板电脑显示器(13.3" 高分辨率 QHD+ (3200 x 1800) 显示器)上运行并在 Windows 控制面板 > 显示器中将比例因子设置为 200% 时,DPI 虚拟化缩放会中断。

该应用一开始加载良好,一切看起来都很棒。然后,当我单击创建 System.Windows.Media.MediaPlayer 对象的按钮时,DPI 虚拟化缩放突然中断。

测试表明正是这种方法可以做到这一点。 System.Windows.Media.MediaPlayer mpPlayer = new MediaPlayer();

测试显示 MediaElement 类存在同样的问题。

是的,即使是具有 DPI-Aware 元素的应用清单也能达到这一点。

所以我的问题是... 有解决方法或解决方法吗? MediaPlayer 与 DPI 虚拟化和 DPI-Awareness 有什么关系?它没有任何可视化方法或属性。

更新:我的最终解决方案

经过大量研究,我发布了解决方案以帮助他人避免痛苦。

将此程序集属性添加到 AssemblyInfo.cs

[程序集:System.Windows.Media.DisableDpiAwareness]

此属性在应用程序集中禁用 DPI 感知,并允许 DPI 虚拟化扩展应用程序。 MediaElement 尊重此属性,并且不会将应用更改为 DPI 感知。

如果应用程序是 Windows 窗体(不是 WPF)... 还有一个额外的步骤。

为这些 dll 或 System.Windows.Media 命名空间添加项目引用将不会被解析。

PresentationCore.dll
WindowsBase.dll

为什么微软不能在 Windows 窗体 dll 中包含这个程序集属性对我来说是个谜。但是whateva。

注意:一位开发人员在论坛中报告说,在 Visual Studio 调试模式下测试时会忽略此程序集属性。你必须编译一个发布版本来测试它。

【问题讨论】:

  • 顺便说一句,系统有 Windows Media Player 12。

标签: c# winforms screen-resolution mediaelement dpi


【解决方案1】:

你看过Microsoft's Writing High-DPI Applications Guide吗?此外,在this guide 中提到您可能需要调用SetProcessDpiAwareness API 方法。 进一步阅读部分还链接了一个 Word 文档,其中包含一些更相关的信息,可以帮助您朝着正确的方向开始。

由于 200% DPI 缩放是 Windows 8.1 的新功能,我预计旧应用程序会出现一些问题,因为无法测试(尤其是在 WinForms 中)。您是否在 Windows 8.1 上看到任何缩放比例较低的问题?

【讨论】:

  • tencntraze,感谢您提供有关 DPI 虚拟化的链接。帮助我发现问题是由 MediaPlayer 引起的。非常感谢。
  • 嗯,我认为答案是 Microsoft Windows Media Player 代码(由 .Net 类 MediaElement、MediaPlayer 使用)导致应用程序从非 DPI 感知转换为 DPI 感知。当应用程序运行非 DPI 感知时,将启用 DPI 虚拟化并且应用程序可以完美扩展。一旦应用调用创建 MediaElement 或 MediaPlayer 的方法,应用就会切换到 DPI 感知,并且 DPI 虚拟化被禁用,从而破坏应用(程序集)用户界面。
  • 咆哮!微软最好认真对待他们自己的程序中的 DPI 意识,因为有大量高分辨率平板电脑冲击消费市场。对 MediaElement、MediaPlayer 的调用不应更改调用程序程序集的 DPI 感知模式。
  • 感谢您更新您的笔记。同意荒谬,这会咬到很多开发人员。 @LTDan
猜你喜欢
  • 2014-04-02
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
相关资源
最近更新 更多