如何在WPF中根据字体大小缩放表单?

2024-02-10

如何在 WPF 中缩放带有字体的表单?

即 WPF 相当于什么

this.Font = SystemFonts.IconTitleFont;

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

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

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

以及表单上的元素scale以适应新的尺寸:

Notice:

  • 形式更宽更高
  • 标签位于更下方和右侧
  • 标签更宽更高
  • 标签文本的右侧或底部边缘未被切断
  • 按钮更宽更高
  • 但按钮位于更下方、更右侧的位置

Note:在 WinForms 中,您还可以使用以下行:

this.Font = SystemFonts.IconTitleFont;

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

类似的 WPF 表单如下所示:

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

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

以及表单上的元素don't缩放以适应新尺寸:

Notice:

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

这是两个按钮的另一个示例相同尺寸:

WinForms:

Windows 演示基础:

奖励阅读

  • WPF:如何在对话框单位中指定单位? https://stackoverflow.com/questions/395195/wpf-how-to-specify-units-in-dialog-units
  • 如何防止 WPF 使用 Windows 字体大小选项进行缩放? https://stackoverflow.com/questions/5857098/how-to-prevent-wpf-from-scaling-with-the-windows-font-size-options
  • .ScaleControl 的 WPF 版本? http://WPF%20version%20of%20.ScaleControl?

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

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

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

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

WPF 不会用那些原始的东西来限制您。它为您提供了一个非常强大的布局系统,在其中制作一个可以完美缩放的窗口将是微不足道的。但相反,您选择通过使用硬编码尺寸来削弱该布局系统。Stop it.

硬编码大小有两个巨大的问题:

  • 它们不适应不同的字体。你已经注意到这一点了。
  • 他们不适应不同的内容。 (当您想要制作应用程序的德语版本,并且德语文本不适合您的硬编码按钮大小时,会发生什么?)

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

你所需要的只是这个:

  • A Window with SizeToContent="WidthAndHeight"。这样,无论您使用什么字体或语言,窗口的大小都将完全适合容纳文本和按钮。
  • 由于您只有两个 UI 元素,并且一个位于另一个之上,因此您可以放置​​一个StackPanel在你的里面Window.
  • Inside the StackPanel, you need:
    • A Label or TextBlock显示您的文本,文本位于Content (Label) or Text (TextBlock); and
    • A Button with HorizontalAlignment="Right",以及文本中Content.
  • 设置一些Margin是在StackPanel, TextBlock, and Button根据您的喜好安排事物的空间。

就是这样。不要对任何东西设置任何其他属性--尤其 not Width or Height.

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

如果您以后想让布局更高级,您可以考虑以下内容:

  • 如果您希望按钮更宽一些(以便在文本前后有更多的呼吸空间),请尝试使用Padding,或设置一个MinWidth and MinHeight。 (不要使用Width or Height如果您的按钮包含文本。你might如果您的按钮仅包含图像,请考虑使用它们,但甚至可能不包含。)
  • 如果您担心字体可能会使窗口太大而不再适合用户的屏幕,并且想要启用自动换行,请尝试使用MaxWidth and TextWrapping.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在WPF中根据字体大小缩放表单? 的相关文章

  • 使 Java JScrollpane 仅垂直滚动

    我希望我的整个 JFrame 能够垂直滚动 我添加了以下代码 但它只创建了一个水平滚动条 frame setContentPane new JScrollPane new GradeQuickResource 我想做相反的事情 我只想要一个
  • 如何循环访问 WPF StackPanel 静态项目?

    可能很容易 但我很难弄清楚这一点 谷歌似乎也没有多大帮助 如何循环遍历 StackPanel 的静态声明元素 无数据绑定 元素在 xaml 中声明 任何帮助表示赞赏 你的意思是StackPanel的孩子们 foreach var child
  • TargetType="controlType" 和 TargetType="{x:Type controlType}" 之间的区别

    在 WPF 中 您可以设置TargetType类型的名称 或者您可以将其设置为 x Type nameOfType 有谁知道有什么区别 没有什么 由于属性类型是Type XAML 解析器知道尝试将您提供的任何内容转换为Type 在其他情况下
  • iOS 中的自定义阿拉伯字体

    我正在尝试制作一个主要显示阿拉伯语内容的 iPhone 应用程序 我想使用自定义阿拉伯字体来显示该内容 而不是 iPhone 默认的阿拉伯字体 我使用了以下代码 void viewDidLoad super viewDidLoad arab
  • font-family 未应用于移动设备

    我的 font family 属性有问题css 我有一个标题 我想使用特定字体设置样式 我在用 fontface 在我的桌面上它工作正常 但在iPhone and iPad我得到了一些标准字体 我认为可能是次 但我不确定 我做了一些研究并尝
  • 带有 ObservableCollection 和动态过滤器的 Silverlight ListBox

    假设我有这门课 public class MyData public bool IsActive get set public String Data1 get set public String Data2 get set and an
  • 如何将 ObservableCollection 绑定到 AvalonDock DocumentPaneGroup?

    我需要在 AvalonDock 2 0 中加载项目集合作为文档 这些对象继承自一个抽象类 我想根据哪个子类在文档中渲染一个框架 这是我的 XAML
  • 为什么无法将 WPFToolkit DataGrid ItemSsource 绑定到 DataTable?

    In a Telerik控制 我能够绑定DataTable直接到ItemSource 但是当我切换到 Codeplex 时WPFToolkit Datagrid
  • 如何隐藏其他选项卡的内容并仅显示所选选项卡的内容

    当我单击特定选项卡时 其他选项卡的内容应该隐藏 但它并没有隐藏 这是我所有的代码 function showStuff id if document getElementById id style display block documen
  • WPF 元素宿主内存泄漏

    我在 Windows 窗体上使用元素主机时遇到奇怪的内存泄漏 我有一个主窗体 它打开另一个窗体 该窗体上只有 elementhost 控件 此时 它没有 wpf 控件子控件 只能打开 1 个主机表单 每次我打开窗体时 应用程序内存都会增加2
  • 我可以禁用特定控件的键盘输入吗?

    是否可以禁用控件的键盘输入 例如一个ListView 我怎么做 我尝试过覆盖KeyUp KeyDown事件 但显然不是这样的 IsEnabled是一个很好的解决方案 但是我只想禁用键盘交互并保持鼠标交互不变 处理KeyDown事件来得太晚了
  • 滚动 X 轴绘图区域 - Silverlight 柱系列

    我有一个工作正常的柱形系列图表 我有一个需要添加的功能 我希望水平滚动能够启用到 x 轴的绘图区域 这是屏幕截图 如果您看到屏幕截图 我有 6 个项目 并且由于项目数量较多 条形图非常细 所以假设如果我有 20 个项目 那么条形图将根本不可
  • 如何在 RichTextBox 中以编程方式移动插入符位置?

    我有一个 RichTextBox 其中的特殊文本位具有自定义格式 但是 存在一个错误 即插入字符后 插入符号会放置在新插入的字符之前而不是之后 这是因为对于每次编辑 代码都会重新计算内容以应用自定义格式 然后像这样设置 CaretPosit
  • 网格内的 ContentPresenter 可见性绑定不起作用?

    我有以下网格
  • 如何在Wpf中的用户控件中调用MahApps Metro对话框

    当我尝试调用 MahApps Metro 对话框时 我在传递值时遇到错误 在传递参数时调用对话框控制时我需要传递 Metrowindow 参数 但我需要在用户控件中调用它 下面是当我需要对话框控制时我将调用的方法 public async
  • ItemSource 中具有不同类型数据的 ListView 多行列标题

    继续this https stackoverflow com q 26712051 1997232问题 我想实现这种ListView 它应该有两件事 多行列标题 不同的数据类型通过绑定ItemsSource以不同方式显示 为了解决 1 我尝
  • 窗口关闭后仍在调用方法

    首先我不知道这是不是一个愚蠢的问题 我有这样的场景 首先我有一个主窗口 public MainWindow InitializeComponent dt is a System Windows Threading DispatcherTim
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import
  • 混合 MFC 和 WPF:模态对话框

    我使用 C CLI 界面层将 C WPF 对话框添加到现有的 C MFC 应用程序 我一切正常 只是我遇到了形式问题 例如 MFC 应用程序使用 ShowDialog 显示 WPF 对话框 按预期工作 该 WPF 对话框显示使用 DoMod

随机推荐

  • Codeigniter 2.1 $this->input->set_cookie($some_var);不工作

    我开始创建一个自定义库 我将加载该库来检查用户是否登录以及注册用户 注册尚未开始 但这并不重要 这是有问题的部分 它不会设置cookie this gt load gt helper cookie some value asd some c
  • Promise { } - 尝试等待 .map

    我在用 map绘制新对象并将旧价格添加到地图中 我将 Async Await 与我的数据图一起使用 这是我的代码的样子 let datasets await changes map async data gt let products le
  • 通过 TCP 连接到 DBus 服务

    我是进程间通信方面的新手 我需要你的帮助和清晰的解释 我有 2 个应用程序 其中一个是服务 一个是客户端 我使用 QT C 来编写它们 当他们在一台本地 PC 上工作时 一切都很好 但我需要把它们分开 所以 我在 IP 192 30 82
  • Href 和 Url.Content 有什么区别?

    Both Href and Url Content可用于解析虚拟路径 该路径相对于文件或文件夹的虚拟根路径 Href 和 Url Content 之间有什么区别 url content 不仅仅创建一个普通的 href 它还考虑应用程序的子
  • 在 Atom 中使用 Hydrogen 设置 Python 虚拟环境

    我正在从 VS Code 切换到 Atom 并且正在尝试为我的 python 项目设置一个虚拟环境 在 VS Code 中这很容易做到 我运行以下脚本 当我运行脚本时 它会自动开始使用新的环境 包含所有必需的包 python3 m venv
  • Android - 检测与特定 wifi ssid 断开连接的正确方法?

    我见过几个 BroadcastReciever 示例来检测 wifi 断开连接 但它们似乎都无法正常工作 例如 每次断开连接触发两次 并且没有提到检查 ssid 这是否可能 所以为了澄清一下 我想检测与特定 ssid 的断开连接 设备上实际
  • 更改格子图中条带上的文本

    如何更改格子图中显示的文本 例子 假设我有一个由 3 列组成的数据框测试 x 1 1 2 3 4 5 6 7 8 9 10 y 1 A A A A A B B B B B a 1 1 9952066 1 7292978 0 8789127
  • 使用标题转动用户位置注释

    我正在尝试更改我的应用程序中的用户注释 以便它显示通常的蓝点 但有一个三角形来显示用户面向的方向 我宁愿旋转用户注释而不是整个地图 这就是 MKUserTrackingModeFollowWithHeading 所做的 我有一个基本版本可以
  • Reflect.getOwnMetadata 不是最新 Aurelia 的 karma 函数

    更新到最新版本的 Aurelia 3 月更新 beta 1 1 4 后 每次运行 karma 测试时都会收到以下错误 Error Reflect getOwnMetadata is not a function Error loading
  • 如何解决 System.Text.Json.JsonException:在实体框架中检测到可能的对象循环? [复制]

    这个问题在这里已经有答案了 我有一个包含表 数据的数据库 因此我使用了数据库优先方法 使用以下命令来构建模型 dotnet ef dbcontext scaffold Server Database MyDb Trusted Connect
  • (简单)HTML属性是否允许在赋值之间有空格

    我正在将一些属性解析为字符串 因此我需要知道如何在 HTML XHTML 元素属性中使用空格 div width 150px div 这也正确吗 div width 150px div 如果有人知道使用 JavaScript 迭代属性及其值
  • gradle 构建中不需要的 tar、zip、jar 分发

    我正在做 gradle build 其中包括许多项目 当我跑步时gradle build命令它生成不需要的包 如 tar zip 那么我应该怎么做才能排除这些任务 我正在使用战争插件来生成战争 apply plugin war 我还使用以下
  • Android 调试技巧

    我的程序经常崩溃 我在 LogCat 中看不到任何内容 也无法在其他地方看到任何有用的信息来找出问题所在 我唯一看到的是某种例外 这是不可接受的 并且使得 Android 编程几乎不可能 我确信一定有一些额外的帮助来调试 但经过几周的搜索
  • 导入路径不能以“.ts”结尾 - NodeJS 和 Visual Code

    我在尝试构建一个简单的 NodeJS 应用程序时遇到错误 即使 Visual Code 提示错误 我的代码仍然运行 当我从 import 语句中删除 ts 扩展名时 出现找不到文件的错误 我正在使用 webpack 但这些文件来自服务器 这
  • >>'运算符[关闭]' aria-label='sql server中的无符号右移'>>>'运算符[关闭]'> sql server中的无符号右移'>>>'运算符[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 如何在sql server中编写无符号右移运算符 表达式就像value gt gt gt 0 这是例如 5381 gt
  • C++:使用“.”表达式和函数调用上的运算符

    我想知道使用成员运算符是否是一个好的做法 像这样 someVector segment getFirst segment getSecond normalize normalCCW 只是这样做是为了展示我想知道的两件不同的事情 即如果使用
  • 如何在CSS中引用带有空格的长类名?

    我正在尝试设计一些 Drupal 输出的样式 特别是 我试图引用一个具有超长名称 包括空格 的类 我不清楚这个的语法 请原谅我 我是 CSS 新手 看
  • winform 中的字段验证

    winforms 中验证字段有快捷方式吗 例如 在保存记录之前需要填写特定的文本框 我总是做的是在保存之前首先以编程方式检查所有必填字段 例子 protected bool CheckFields bool isOk false if te
  • 在 Android 中处理 unix 信号

    我正在编写一个 Java 应用程序 它使用命名管道与 C 应用程序进行通信 当 C 应用程序终止时 Java 会收到 SIGPIPE Java 应用程序也会终止 在 C C 上 我知道如何捕获该信号并忽略它 是否可以在 Android Ja
  • 如何在WPF中根据字体大小缩放表单?

    如何在 WPF 中缩放带有字体的表单 即 WPF 相当于什么 this Font SystemFonts IconTitleFont 在 WinForms 中 如果您是一名优秀的开发人员 您就会尊重用户的字体首选项 一个 WinForm 的