WPF high dpi issues



我创建了一个简单的 Web 浏览器 WPF 测试应用程序,其中包含画布中的图片和文本,窗口设置为 96dpi。

然后我切换到 120 dpi 和 :-(((显示混乱,图像大小改变,部分画布不在视野中......

当我使用 Winforms 时,我将 AutoScaleMode 属性设置为 None 并且窗口保持其大小,控件也是如此,继承字体的控件都正确显示,不模糊也不太大......

我该怎么做才能在 W ̈F 中模仿这种(良好的)行为?

我不清楚你所说的"Web 浏览器 WPF ...应用"。WPF 不会在 Web 浏览器中运行,除非您谈论的是 XBAP。还是你在做Silverlight?或者它只是一个 WPF 导航应用程序,根本不基于浏览器?你需要澄清。

当您

在高 DPI 模式下运行时,WPF 会自动缩放内容。这是预期行为:如果用户明确表示他们希望屏幕上的所有内容都变大,则 WPF 将尊重用户的意愿。"假装高 DPI 不存在,只是以正常的小尺寸显示所有内容并希望它不会惹恼用户太多"的旧 WinForms 黑客在 WPF 中不可用;如果你努力的话,你可能会效仿他们,但你被非常强烈地引导去做正确的事情。

WPF 缩放所有内容,因此"画布的一部分不在视图之外"的说法没有意义。它应该以相同的量缩放画布、其父窗口和子元素,因此如果所有内容都适合 96dpi,它也应该适合 120dpi 和 144dpi。如果没有,那么你正在做一些奇怪的事情,你必须提供一个重现问题的代码示例。

您似乎声称在高 DPI 模式下运行时字体模糊,这听起来很奇怪。字体呈现为矢量,因此它们应该清晰地缩放,即使在高 DPI 模式下也能清晰地呈现。我从未见过您描述的模糊字体,因此,您必须再次提供重现案例。

我唯一期望模糊的是图像。如果您在UI中使用光栅(位图)图像(BMP/GIF/JPG/PNG) - 例如,用于工具栏上的图标 - 那么是的,当它们缩放时,它们看起来会很糟糕。当你拿一个小位图并把它变大时,它看起来总是很糟糕。你可以尝试通过使用较大的图像并缩小它们的大小以显示来解决此问题 - 例如,如果希望工具栏图像为 16x16(在标准 96 dpi 模式下),则可以尝试在项目中放置 32x32 位图,在 XAML 中设置 Image 元素的 Width="16" 和 Height="16", 看看这看起来是否更好。它实际上是 120dpi 模式下的 20x20 物理像素和 144dpi 模式下的 24x24,两者都仍将从 32x32 资源缩小,因此比必须放大的 16x16 源图像看起来更好。(不过,我还没有在 WPF 工具栏中尝试过这种技术,所以我不知道它在实践中与典型工具栏图像的实际效果如何。

解决缩放图像问题的最佳方法是使用矢量图像而不是栅格。不幸的是,很难找到矢量图像库。它们很少,相距甚远,通常不如位图图像全面,而且通常很昂贵。

大概你使用固定长度单位(px)。尝试重新布局项目,同时牢记 WPF 布局规则。此页面提供了一些最佳实践。

我刚刚在 .NET 4 中在 WPF 下使用 MaxHeight 发现了一个错误,该错误设置在由另一种样式继承并用作StaticResource的样式中,它不受用户设置的 DPI 的影响。我把它从MaxHeight设置为Height,然后它受到DPI的影响。我怀疑这里的 .NET 4(可能还有其他框架)中存在错误。

最新更新