我创建了一个简单的 Web 浏览器 WPF 测试应用程序,其中包含画布中的图片和文本,窗口设置为 96dpi。
然后我切换到 120 dpi 和 :-((( 显示混乱,图像大小改变,部分画布看不见......
当我使用 Winforms 时,我将 AutoScaleMode 属性设置为 None 并且窗口保持其大小,控件以及继承字体的控件正确显示,不模糊也不太大......
我能做些什么来模仿 W¨F 中的这种(良好)行为?
我创建了一个简单的 Web 浏览器 WPF 测试应用程序,其中包含画布中的图片和文本,窗口设置为 96dpi。
然后我切换到 120 dpi 和 :-((( 显示混乱,图像大小改变,部分画布看不见......
当我使用 Winforms 时,我将 AutoScaleMode 属性设置为 None 并且窗口保持其大小,控件以及继承字体的控件正确显示,不模糊也不太大......
我能做些什么来模仿 W¨F 中的这种(良好)行为?
大概您使用固定长度单位 (px)。尝试重新布局您的项目,同时牢记 WPF 布局规则。此页面为此提供了一些最佳实践。
我刚刚MaxHeight
在 .NET 4 中的 WPF 下发现了一个错误,该错误设置为 Style 被另一个 Style 继承并用作StaticResource
,它不受用户设置的 DPI 的影响。我将它设置MaxHeight
为Height
,然后它受到 DPI 的影响。我怀疑这里的 .NET 4(可能还有其他框架)存在错误。
我不清楚您所说的“Web 浏览器 WPF ...应用程序”是什么意思。WPF 不在 Web 浏览器中运行,除非您在谈论 XBAP。还是你在做 Silverlight?或者它只是一个 WPF 导航应用程序而不是基于浏览器的?你需要澄清一下。
当您在高 DPI 模式下运行时,WPF 会自动缩放您的内容。这是预期的行为:如果用户明确表示他们希望屏幕上的所有内容都更大,那么 WPF 将尊重用户的意愿。旧的 WinForms hack 的“假装高 DPI 不存在,只是以正常的小尺寸显示所有内容并希望它不会让用户太生气”在 WPF 中不可用;如果你在这方面工作,你可能会效仿他们,但你会非常强烈地转向做正确的事。
WPF 会缩放所有内容,因此您所说的“部分画布不在视野范围内”是没有意义的。它应该以相同的量缩放画布、它的父窗口和它的子元素,所以如果一切都适合 96dpi,它也应该适合 120dpi 和 144dpi。如果没有,那么你正在做一些奇怪的事情,你必须提供一个重现问题的代码示例。
您似乎声称在高 DPI 模式下运行时字体模糊,这听起来很奇怪。字体被渲染为矢量,因此它们应该清晰地缩放,即使在高 DPI 模式下也能清晰地渲染。我从来没有见过你描述的模糊字体,所以再一次,你必须提供一个复制案例。
我唯一希望模糊的是图像。如果您在 UI 中使用光栅(位图)图像(BMP / GIF / JPG / PNG)——例如,工具栏上的图标——那么是的,当它们被缩放时看起来会很糟糕。当您使用小位图并将其放大时,它几乎总是看起来很糟糕。您可以尝试通过使用更大的图像并缩小它们的大小以进行显示来解决此问题 - 例如,如果您希望工具栏图像为 16x16(在标准 96-dpi 模式下),那么您可以尝试在您的项目,在您的 XAML 中设置 Image 元素的 Width="16" 和 Height="16",然后查看是否看起来更好。在 120dpi 模式下实际上是 20x20 物理像素,在 144dpi 模式下是 24x24,两者都将从 32x32 资源按比例缩小,因此比必须按比例放大的 16x16 源图像具有更好的外观。(不过,我还没有在 WPF 工具栏中尝试过这种技术,所以我不知道它在实际使用典型的工具栏图像时效果如何。)
解决缩放图像问题的最佳方法是使用矢量图而不是光栅。不幸的是,很难找到矢量图像库。它们很少,相差甚远,通常不如您可以找到的位图图像全面,而且通常很昂贵。