文本在 WPF 窗口和 ElementHost 内的呈现方式不同

2024-03-17

我使用 WPF 互操作性在 WinForms 表单内托管 WPF 用户控件。 除了丑陋的文本渲染之外,一切正常:

    <Label Content="Normal text" Name="labelNormal"/>
    <Label Content="Bold text" Name="labelBold" FontWeight="Bold" />

-- 这是 WPF 窗口上的简单标签:
WPF 窗口 http://img525.imageshack.us/img525/7049/wpfwindow.png http://img525.imageshack.us/img525/7049/wpfwindow.png

-- and the same labels shown when the WPF user control is hosted in WinForms:
WPF Interop

互操作变体完全不同:字符间间隔为零,并且文本看起来比纯 WPF 变体更粗体。当普通文本可以接受时,粗体文本就很难看了。

有什么想法如何解决它吗?

先感谢您!


(1 月 18 日编辑补充说,这不仅仅是字体渲染模式,还有字体本身。)

这里有两个相关因素:字体和字体格式模式。

您的 Windows 窗体主机应用程序正在强制使用默认字体系列“Microsoft Sans Serif”,字体大小为 8.25pt,在 WPF 的测量单位中是FontSize11。但 WPF 通常会使用不同的字体 - 我运行的是带有默认 Aero 主题的 Windows 7,而 WPF 默认为 Segoe UI,带有FontSize of 12.

因此,您在这里看到不同结果的最大原因是它们是两种不同的字体。添加FontFamily="Segoe UI" FontSize="12" to the UserControlroot 元素使这两个 WPF 示例在我看来更加一致。 (但这当然会使您的 WPF 文本看起来与包含的 Windows 窗体应用程序中的文本不太一致。这就是ElementHost将 Windows 窗体字体选择传播到 WPF 内容中。)

在编辑此内容之前,我曾想过这可能是由于Ideal and DisplayWPF 文本呈现模式。意识到这主要与字体有关后,我不再认为情况是这样,但我将在这里保留对其他问题的讨论,因为它对于任何试图使其 WPF 文本看起来与 Windows 一致的人仍然有用表格文本。 WPF 的默认值是Ideal,但是如果您在 Windows 窗体应用程序中运行,可以说Display更好,因为这会使其看起来与 Windows 窗体通常呈现事物的方式一致。

您可以通过添加以下内容在 WPF 中针对每个元素进行控制:

TextOptions.TextFormattingMode="Display"

(or "Display"取决于您想要哪种模式)。此可附加属性是在 WPF v4 中添加的,让您可以在 WPF 自首次发布以来所具有的可缩放但稍微模糊的文本渲染和 Win32 和 GDI+(因此 Windows表格)使用。这将影响您应用它的元素以及任何后代。 (例如,如果您将其设置为StackPanel它应该适用于该面板中的所有元素,除非您还在子项上本地将其设置为不同的值。)

默认情况下,WPF 尝试比 Win32 或 GDI+ 保持对原始字体设计更好的保真度。它还以一种一致缩放的方式呈现文本 - 增加字体大小,例如 12% 将使屏幕上文本的宽度增大 12%。在 Win32 或 GDI+ 中情况并非如此,您会得到相当复杂的非线性变化。

但许多人抱怨说,为了换取更好的保真度,却得到了模糊度的增加。这就是 WPF 4 引入该新属性的原因。将其设置为Display以获得保真度较低但更清晰的旧式渲染。

由于您可以在每个元素的基础上选择它,因此您可以为粗体和普通文本独立选择您喜欢的外观。

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

文本在 WPF 窗口和 ElementHost 内的呈现方式不同 的相关文章

  • App 对象中的 Log4Net?

    我正在开始在 WPF 桌面应用程序中进行日志记录 使用 Log4Net 作为日志记录组件 这是我的问题 在一个简单的桌面应用程序中 是否有任何理由不将我的记录器实例化为 App 类 App xaml cs 的属性 就像这样 public p
  • 通过样式设置 DataGridCellsPresenter 的 ItemsPanel 不起作用

    我正在尝试设置ItemsPanel of a DataGridCellsPresenter在我的窗口的资源中 Bu
  • Relay/ICommand 与 DelegateCommand——差异

    据我所知 下面的代码可以从 Relay ICommand 命令更改为 Delegate 命令 并且仍然以相同的方式绑定命令 如果我错了 它们的区别和用途是什么 private DelegateCommand something public
  • 将集合绑定到自定义控件属性

    我没有运气尝试将数据集合绑定到我的自定义控件的属性 我已经实现了该控件的字符串属性的机制 在此处提供了一些帮助 并期望集合类型同样简单 但是我无法让它再次工作 这是我的自定义控件视图
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • 有没有基于 WPF 的 Markdown 渲染器? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们有基于 WPF 的应用程序 我们有单独的字符串存储库 其中的文本在网络中进行编辑 在我们的 WPF
  • 当其源是 https uri 时如何使 wpf MediaElement 播放

    在 wpf 独立应用程序 exe 中 我在主窗口中包含了 MediaElement
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾
  • 如何使用 MVVM 打开和关闭新 Windows?

    对于 MVVM 和 WPF 什么是处理打开和关闭新窗口和对话框的好 直接方法 打开和关闭应该由 ViewModel 驱动 对吗 但 ViewModel 不应该知道视图 我通常为此使用接口 例如 如果我想在单独的窗口中编辑记录 我有一个接口
  • WPF ListBox - 如何从数据表中放入值?

    I have ListBox并希望将值放入此列表框中DataTable listBoxVisibleFields DataContext SelectedFields Where SelectedFields is a DataTable充
  • 跨项目/dll 访问 Xaml 中的资源

    是否可以从另一个项目引用存储在 ResourceDictionary 构建操作 资源 中的 Xaml 资源 我想将资产合并到主项目的资源字典中或单独访问它们 例如 项目 MyResources 包含一个名为 Assets 的文件夹 其中有一
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • WPF Datagrid 循环/选择具有特定属性的单元格

    全新的 WPF 对 WinForms 非常熟悉 这可能会让过渡变得更加困难 我正在尝试将旧 WinForms 项目中的一些功能移植到 WPF 中作为学习体验 目标是在 DataGrid 中查找与 TextBox 中的字符串匹配的单元格值 我
  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • 从固定文档中删除页面?

    如何从固定文档中删除页面 我添加这样的页面 Add page to pageContent PageContent pageContent new PageContent IAddChild pageContent AddChild fix
  • 如何防止在 ActiveX 方法调用期间重新进入 WPF 事件处理程序?

    我们从 WPF 和 STA 应用程序中调用 ActiveX 组件上的方法 此调用是通过以下方式后期绑定执行的 res ocx GetType InvokeMember methodName flags null ocx args 其中 oc
  • WPF DataGrid 验证/绑定模式错误

    我创建了一个非常简单的新项目 仅测试 Microsoft WPF DataGrid 行为 不涉及其他 我只使用标准的 DataGrid
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 在 WPF 中使用 Datagrid 进行多重选择

    我想知道如何使用 DataGridCheckBoxColumn 选择多行 这里我只能选择一行 但如何进行多项选择 我的 XAML 如下

随机推荐