C# WPF换行:使用自定义字体时缺少单词

C# WPF换行:使用自定义字体时缺少单词,c#,wpf,word-wrap,custom-font,C#,Wpf,Word Wrap,Custom Font,我在WPF应用程序中使用一种自定义字体,称为。我发现,有时,使用这种字体的文本块中的单词会消失。消失的单词会出现在它们所在行的末尾,或者可能出现在下一行,这让我觉得文本包装有问题。我终于(在经历了很多困难之后)将问题隔离到一小段代码中(注意:这只是一个确认问题发生的测试。这不是我程序的一部分): 很奇怪!有没有办法防止这种情况发生?我的老板真的很想使用这种字体,所以我不能选择另一种字体(我从未见过这种情况发生在任何其他字体上)。我也不太热衷于观察布局中的每一个变化,并适当地调整使用Pigiarn

我在WPF应用程序中使用一种自定义字体,称为。我发现,有时,使用这种字体的文本块中的单词会消失。消失的单词会出现在它们所在行的末尾,或者可能出现在下一行,这让我觉得文本包装有问题。我终于(在经历了很多困难之后)将问题隔离到一小段代码中(注意:这只是一个确认问题发生的测试。这不是我程序的一部分):


很奇怪!有没有办法防止这种情况发生?我的老板真的很想使用这种字体,所以我不能选择另一种字体(我从未见过这种情况发生在任何其他字体上)。我也不太热衷于观察布局中的每一个变化,并适当地调整使用Pigiarniq的每个文本块的大小

我们实际上在默认系统字体方面遇到了相同的问题。 这似乎是textblock换行功能本身的一个缺陷

我们发现在固定大小的窗口中,换行符有时会忽略最后一个单词。 这种情况发生在各种大小和句子中

我们找不到真正的解决方案,所以我们的解决办法是在文本中手动包含换行符


我们也在这个问题上做了相当多的谷歌搜索,因为我不相信这样的问题是没有记录的。但这似乎是没有记录的(或者至少在两个月前很难找到),经过一些非常严格的测试,我确信这实际上是一个bug。

我可以通过设置TextAlignment=“Left”来解决这个问题和文本块上的HorizontalAlignment=“Stretch”。

为什么要
textBlock1.Width=Double.NaN
TextBox.Loaded
eventhandler?我怀疑这与字体本身有关。尝试任何其他字体,使用
Width=“850”
,我相信您也会发现隐藏其他字体文本的值。你的作文有点不清楚。为什么要将文本块放在另一个网格中?我猜网格中的这个文本块会把事情搞得一团糟。另外,将加载的事件保留在外。我不明白为什么会有这个。@publicgk:我不知道。我正在证明,如果您将TextBlock的宽度切换回Auto(相当于将其设置为NaN),则会返回错误行为。@Markus:我尝试用其他几种字体(文本位于上面的TextBlock中)复制此行为—我没有成功。如果有人在其他字体中发现这种情况,请告诉我。这似乎是非常具体的上下文。关于组合:我试图复制我的程序中发生的行为,这样我就不必在此基础上发布大量代码。有时会在网格中找到有此问题的文本块。关于加载的事件:我不想要加载的事件。但是如果没有它,问题就会出现。@skybluecodeflier尝试使用Snoop检查textblock,看看它是否得到DesiredSize和ActualSize的有效值(同时检查Snoop中的文本框是否显示正确)。我真的认为这是一个更大的问题,网格剪辑了文本块,而与文本块无关。出于好奇,您是否已将其作为一个bug发布在connect.microsoft.com页面上?如果不是的话,我会把这个bug发布到那里。事实上,对于我遇到的一些问题,我使用了相同的解决方法。但是,当你有很多文本时,这样做是很粗糙的。:)不-太懒了,不想写错误报告,我必须说这是一个很小的错误(在某种意义上,我希望它会广泛传播和广为人知),我有点惊讶它没有被报告,甚至在任何地方都没有被提及……好的。所以我就在微软的网站上发布了这个bug。这是你的电话号码。如果你能去那里并表明你可以复制这个bug,我将不胜感激。希望我的项目文件很快会出现在他们的网站上……而且,我现在还不打算将此标记为答案。也就是说,直到我从微软得到某种令人满意的回应。我希望找到一个比我们目前所发现的更好的解决方案。谢谢你的帮助!
<Window x:Class="Test_the_textbox_width.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="850">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition />
    </Grid.RowDefinitions>
    <Grid 
          HorizontalAlignment="Center">
    <TextBlock HorizontalAlignment="Left"
               Name="textBlock1"
               VerticalAlignment="Top"
               FontFamily="Pigiarniq%20Regular.ttf#Pigiarniq"
               TextWrapping="Wrap"
               FontSize="15"
               Margin="10">
        <TextBlock.Text>
             You do not need to enter both manually. Rates are calculated using true depositional 
            (uncompacted) thicknesses, rather than measured present-day thicknesses.
        </TextBlock.Text>
    </TextBlock>
    </Grid>

</Grid>
private void textBlock1_Loaded(object sender, RoutedEventArgs e)
    {
        textBlock1.Width = textBlock1.ActualWidth;
        //textBlock1.Width = Double.NaN;  //if you leave this in, you get the bad behaviour
    }