【问题标题】:WPF high dpi issuesWPF 高 dpi 问题
【发布时间】:2011-08-21 00:27:32
【问题描述】:

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

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

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

我可以做些什么来模仿 W¨F 中的这种(良好)行为?

【问题讨论】:

    标签: wpf dpi autoscalemode


    【解决方案1】:

    我不清楚您所说的“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 模式下),那么您可以尝试将 32x32 位图放入您的项目,在您的 XAML 中设置 Image 元素的 Width="16" 和 Height="16",然后查看是否看起来更好。在 120dpi 模式下实际上是 20x20 物理像素,在 144dpi 模式下是 24x24,这两者仍然会从 32x32 资源按比例缩小,因此比必须放大的 16x16 源图像具有更好的外观. (不过,我还没有在 WPF 工具栏中尝试过这种技术,所以我不知道它在实际使用典型的工具栏图像时效果如何。)

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

    【讨论】:

    • 乔,我说的是 xbap。虽然我完全知道 ALL 是根据 WPF 中的 120 或 144 dpi 重绘的。抱歉字体模糊,你是真的,那些是封装在位图图像中的字母......我的错!话虽如此,当您以 96 dpi 绘制适合整个屏幕的应用程序时,如果另一个用户使用 144 dpi,他将几乎看不到您的应用程序。所以问题是:他必须使用滚动条还是调整整个东西的大小?
    • 所以你想硬编码一个 XBAP 以完全适合,比如说,1024x768 屏幕?你正在打一场艰苦的战斗。不同的用户将拥有不同的浏览器版本,具有不同的工具栏和其他 chrome 占用不同数量的垂直空间。它们将具有不同的 Windows 设置(标题栏高度、任务栏高度,甚至任务栏停靠在显示器的哪一侧)。更不用说不同的屏幕分辨率和纵横比(例如更宽但不那么高的宽屏显示器)。您最好使用 WPF 的布局功能来设计一个可以优雅调整大小的 UI。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        相关资源
        最近更新 更多