5

WPF アプリケーションでPigiarniqと呼ばれるカスタム フォントを使用しています。このフォントを使用する TextBlocks から時々単語が消えることがわかりました。消えた単語は、その行の最後か、おそらく次の行に表示されていたので、テキストの折り返しに何か問題があると思います。私は最終的に(多くの困難の後)問題を小さなコードに分離しました(注:これは問題が発生することを確認するためのテストにすぎません。これは私のプログラムの一部ではありません):

<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>

「(圧縮されていない)」の後の「厚さ」という言葉は現れません。ウィンドウ ハンドルを使用して手動でウィンドウのサイズを変更すると、再表示されます。

注: TextBlock が Grid 内にある場合にこの問題が発生することがあるため、上記の Grid 要素に TextBlock を配置しました。別のインスタンスでは、InlineUIContainer 内にありました。他にも例がありました。

TextBlock で Loaded イベントをサブスクライブする場合など、幅を明示的に設定すると、この動作は発生しないことがわかりました。

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
    }

非常に奇妙な!これが起こらないようにする方法についてのアイデアはありますか? 私の上司は本当にこのフォントを使いたがっているので、別のフォントを選択できるわけではありません (他のフォントでこれが起こるのを見たことがありません)。また、レイアウトのすべての変更を監視し、Pigiarniq を使用するすべてのテキストブロックを適切にサイズ変更するという考えにもあまり熱心ではありません。

4

2 に答える 2

2

実際、デフォルトのシステム フォントでも同じ問題が発生しました。これは、テキストブロックの改行機能自体のバグのようです。

固定サイズのウィンドウでは、改行が最後の単語を無視する場合があることがわかりました。これは、さまざまなサイズと文で発生しました。

実際の解決策を見つけることができなかったため、回避策としてテキストに改行を手動で含めることでした。

そのような問題が文書化されていないと信じることを拒否したため、この件についてもかなりのグーグル検索を行いました..しかし、これは文書化されていないようです(または少なくとも2か月前の時点で見つけるのは難しいです)。いくつかの非常に厳密なテストの後、私はこれは実際にはバグであると確信しています。

于 2011-04-03T16:55:25.150 に答える
1

TextBlock で TextAlignment="Left" と Horizo​​ntalAlignment="Stretch" を設定することで、これを回避できました。

于 2013-10-16T21:31:48.577 に答える