【问题标题】:How to scale form with font size in WPF?如何在 WPF 中使用字体大小缩放表单?
【发布时间】:2023-04-01 06:41:01
【问题描述】:

如何在 WPF 中使用字体缩放表单?

的 WPF 等价物是什么
this.Font = SystemFonts.IconTitleFont;

在 WinForms 中,如果您是一名优秀的开发人员,您就会尊重用户的字体偏好。一个 WinForm 开头为:

然后应用用户的字体首选项:

this.Font = new Font("Segoe Print", 11, GraphicsUnit.Point);

表格上的元素缩放以适应新的尺寸:

注意:

  • 表格更宽更高
  • 标签位置更靠下,更靠右
  • 标签更宽更高
  • 标签的文本在右侧或底部边缘没有被截断
  • 按钮更宽更高
  • 但按钮位于更下方和右侧

注意:在 WinForms 中您也可以使用以下行:

this.Font = SystemFonts.IconTitleFont;

WPF 不支持Font,这就是为什么我提供了更清晰的替代方案。下面的例子。

类似的 WPF 表单开头如下:

然后,您可以通过以下方式应用用户的字体首选项:

        this.FontFamily = new FontFamily("Segoe Print");
        this.FontSize = 14.666; //11pt = 14.66

表单上的元素不会缩放以适应新的大小:

注意:

  • 标签的位置没有改变
  • 按钮的位置没有改变
  • 表格没有变宽或变高(文本被截断)
  • 标签没有变宽(右边的文字被剪掉了)
  • 标签没有更高(沿底部边缘截断文本)
  • 按钮没有变宽(文本被截断)

这是另一个大小相同的两个按钮的示例:

WinForms:

Windows Presentation Foundation:

阅读奖励

【问题讨论】:

    标签: wpf user-interface fonts


    【解决方案1】:

    WPF 不进行基于原始字体的缩放,因为它...嗯,原始的。您可以在自己的屏幕截图中看到它。

    这是您的“更改字体之前的 WinForms”屏幕截图。看看“坐在原木上”之间有多少空间。和表格的右边缘。

    这是您的“WinForms,更改字体后”屏幕截图。请注意“缩放”后您的余量减少了多少。

    如果您没有留下所有多余的空间,那么您的标签将被新字体切断。对于某些字体,即使您 确实 留下了所有多余的空间,它也会被切断。这就是我说 WinForms 的缩放是“原始的”时的意思。 WinForms 选择一个单一的比例来应用于所有内容,并且选择该比例时不会对您的内容有任何认识;它基于字体的平均统计数据,一旦你开始谈论细节,它就会崩溃。

    WPF 不会用那么原始的东西来阻碍你。它为您提供了一个非常强大的布局系统,在其中制作一个缩放精美的窗口将是微不足道的。但相反,您选择使用硬编码的尺寸来削弱该布局系统。 停下来。

    硬编码尺寸有两个大问题:

    • 它们不适应不同的字体。你已经注意到了。
    • 它们不适应不同的内容。 (如果您想制作德语版本的应用,而德语文本不适合您的硬编码按钮大小,会发生什么情况?)

    硬编码大小只是不适应。任何东西。你必须在 WinForms 中使用它们,因为 WinForms 都支持这些。但是 WPF 为您提供了一个适当的布局系统,因此您不必(也不应该)使用任何粗糙的东西。

    你只需要这个:

    • WindowSizeToContent="WidthAndHeight"。这样一来,无论您使用什么字体或语言,窗口的大小都可以完全容纳文本和按钮。
    • 由于您只有两个 UI 元素,并且一个在另一个之上,因此您可以在 Window 中放置一个 StackPanel
    • StackPanel 中,您需要:
      • LabelTextBlock 显示您的文本,文本在 Content (Label) 或 Text (TextBlock) 中;和
      • ButtonHorizontalAlignment="Right",以及 Content 中的文本。
    • StackPanelTextBlockButton 上设置一些Margins,以根据自己的喜好设置空间。

    就是这样。不要在任何东西上设置任何其他属性——尤其是不是WidthHeight

    现在,如果您更改字体,窗口和按钮的大小仍将完全正确,并且不会截断您的文本。如果您将应用本地化为其他语言,则窗口和按钮的大小将完全正确,并且不会截断您的文本。停止与 WPF 作斗争,它会给你带来很好的结果。

    如果你以后想让你的布局更高级,你可以考虑这样的事情:

    • 如果您希望按钮更宽一些(以便在文本前后有更多的呼吸空间),请尝试使用Padding,或设置MinWidthMinHeight。 (如果您的按钮包含文本,请不要使用 WidthHeight。如果您的按钮仅包含图像,您可能考虑使用它们,但即使那样也可能不会。)
    • 如果您担心字体可能会使窗口过大以致不再适合用户的屏幕,并且想要启用自动换行,那么请尝试使用MaxWidthTextWrapping

    WPF 的布局系统非常强大。学习它。不要通过使用硬编码布局然后抱怨你的硬编码布局很糟糕来与之抗争。

    【讨论】:

      猜你喜欢
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 2023-03-22
      • 2016-03-14
      • 1970-01-01
      相关资源
      最近更新 更多