【问题标题】:WPF Measuring Text Width Incorrectly with TextFormattingMode="Display" and HyphensWPF 使用 TextFormattingMode="Display" 和连字符错误地测量文本宽度
【发布时间】:2013-05-29 19:12:40
【问题描述】:

您可以在此处查看问题以及如何重现它:

此问题会导致文本块中最长行末尾的单词被截断。请注意最后一个TextBlock 缺少“动物”一词。

有人知道这个问题的解决方法吗?或者有什么相关信息?我需要基本上保持第二个TextBlock 的渲染和布局行为 - 但只需要所有单词都存在。

XAML 复制代码:

<Window x:Class="TextWeirdness.Application.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>

        <StackPanel.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="Text" Value="{Binding Text, ElementName=ATextBox}"/>
                <Setter Property="FontSize" Value="{Binding Value, ElementName=ASlider}"/>
                <Setter Property="FontFamily" Value="Arial"/>
                <Setter Property="HorizontalAlignment" Value="Left"/>
                <Setter Property="TextWrapping" Value="Wrap"/>
            </Style>
        </StackPanel.Resources>

        <Slider Name="ASlider" Minimum="1" Maximum="30" Value="12" />
        <TextBox Name="ATextBox" Text="I love mules - best of all the animals" AcceptsReturn="True"/>

        <TextBlock />
        <TextBlock TextOptions.TextFormattingMode="Display"/>
    </StackPanel>
</Window>

更多信息:

  • 只有在文本中出现连字符(但只有减号)时才会出现问题。
  • 仅当字体大小在特定的重复范围内时才会发生(不过我不知道那是什么)。
  • 仅适用于某些字体。
    • 宋体
    • 巴克斯顿素描
    • Calibri
    • Calibri Light
    • 寒武纪
    • 坎布里亚数学
    • 君士坦丁
    • 牛腿
    • DokChampa
    • 尤菲米亚
    • 全球等宽空间
    • 全球无衬线字体
    • 全球衬线
    • 蒙古白提
    • 尼亚拉
    • 帕拉蒂诺列型
    • 新罗马时代

【问题讨论】:

  • 如果你删除&lt;Setter Property="HorizontalAlignment" Value="Left"/&gt;,它仍然会发生吗?
  • HorizontalAlignmentStretch 时问题确实消失了,但如果可能的话,我想保持这种行为。
  • 对于它的价值,我看到的是空格字符 - 该字符的宽度在显示模式与理想模式下的显示方式不同

标签: wpf text formatting gdi textblock


【解决方案1】:

如果你可以删除

<Setter Property="TextWrapping" Value="Wrap"/>

那么这将作为解决方法...

这是一个错误,您应该通过 Microsoft Connect 站点报告它,但不要屏息以待很快修复它。事实上,它可能永远不会得到修复。

我的经验表明,在过去几年中,Microsoft 需要超过 6 个月的时间才能做出响应(如果有的话),大多数错误将被归类为由设计引起的,或者如果您在字里行间读到“Microsoft 有比这更好的事情要做修复错误”。我的估计是 .NET 5.0 修复此问题的可能性

【讨论】:

  • 我确实提交了,他们的回答和你说的差不多。 link。至于您的回答,我真的很想保留文本块的样式,但这确实可以解决这个问题。
  • @Locdarb - 那么没有别的事可做,除了忍受这个错误。 (除非你想开始为你的事业团结人们,以获得足够的选票让微软看到这实际上影响了“最多的 WPF 开发人员”,或者至少足以让微软关心......)
【解决方案2】:

我们遇到了同样的问题。我们的客户能够自定义字体系列和大小,其中一些客户报告缺少单词。

我们选择的解决方法是将默认的连字符/减号替换为 ‐ Unicode 字符。这在标点符号的意义上似乎是正确的,但无论如何有点麻烦。这就是我们考虑自动检查和更新构建服务器上的所有 resx 文件的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2020-04-22
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多