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