WPF中的“Glyphs”无法像“TextBlock”一样正确呈现文本

5
我正在使用Glyphs元素制作WPF文本编辑器,但是我遇到了一个问题,就是文本没有正确地绘制,正如您在图片中所看到的那样。我该如何解决这个问题?

enter image description here

存在两个问题:

  1. 字母之间的字符间距。
  2. 字母和变音符之间的字符间距。

我通过使用 GetKerningPairs 函数解决了第一个问题。

我该如何解决这个问题,也许我错了?

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="200" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="AUTO"/>
            <RowDefinition Height="AUTO"/>
        </Grid.RowDefinitions>

        <TextBlock Text="TextBlock" VerticalAlignment="Center" Margin="6"/>
        <TextBlock Grid.Row="1" Text="Glyphs" VerticalAlignment="Center" Margin="6"/>

        <TextBlock Text="בְּרֵאשִׁית" Grid.Column="1" FontSize="50" FontFamily="Times New Roman"
                   FontWeight="Normal" Grid.Row="0"/>

        <Glyphs Grid.Row="1" Grid.Column="1"
            FontUri             = "C:\WINDOWS\Fonts\TIMES.TTF"
            FontRenderingEmSize = "50"
            UnicodeString       = "בְּרֵאשִׁית"
            BidiLevel="1"
            Fill                = "Black"/>

        <TextBlock Text="AVAV" Grid.Column="2" FontSize="50" FontFamily="Times New Roman"
                   FontWeight="Normal" Grid.Row="0"/>

        <Glyphs Grid.Row="1" Grid.Column="2"
            FontUri             = "C:\WINDOWS\Fonts\TIMES.TTF"
            FontRenderingEmSize = "50"
            UnicodeString       = "AVAV"
            BidiLevel="0"
            Fill                = "Black"/>

    </Grid>
</Window>

看起来问题在于字体类型,如果你看英文字符,一个是等宽的,而另一个是定距的。你必须看字符的宽度和字符之间的空格。等宽字符的字符和空格都是相同的。定距字符的字符宽度不同,字符之间的空格相同。所以看起来 Glyphs 使用了定距,而下标被左对齐了。 - jdweng
你可能还应该设置字形的Indices属性。请参阅介绍GlyphRun对象和Glyphs元素 - Clemens
是的,我根据从“GetKerningPairs”函数获取的内容设置了Indices属性,但字体文件是否包含变音符号的Indices呢? - google dev
2个回答

2
如@Codedom所说,您必须定义自己的列表,它可能如下所示:
class Program
{
    static void Main(string[] args)
    {
        var list = new List<DiacriticsKerning>();
        list.Add(new DiacriticsKerning('א', 'ָ', HorizontalAlignment.Center, VerticalAlignment.None));
        list.Add(new DiacriticsKerning('ב', 'ָ', HorizontalAlignment.Center, VerticalAlignment.None));
        list.Add(new DiacriticsKerning('ג', 'ָ', HorizontalAlignment.Center, VerticalAlignment.None));
        list.Add(new DiacriticsKerning('ד', 'ָ', HorizontalAlignment.Right, VerticalAlignment.None));
        list.Add(new DiacriticsKerning('ה', 'ָ', HorizontalAlignment.Center, VerticalAlignment.None));
        list.Add(new DiacriticsKerning('ו', 'ָ', HorizontalAlignment.Center, VerticalAlignment.None));
        // ...
    }
}

struct DiacriticsKerning
{
    public DiacriticsKerning(char letter, char diacritics, HorizontalAlignment alignmentHorizontal, VerticalAlignment alignmentVertical)
    {
        Letters = letter;
        Diacritics = diacritics;
        HorizontalAlignment = alignmentHorizontal;
        VerticalAlignment = alignmentVertical;
    }

    char Letters;
    char Diacritics;
    HorizontalAlignment HorizontalAlignment;
    VerticalAlignment VerticalAlignment;
}

enum HorizontalAlignment { None, Center, Left, Right, }

enum VerticalAlignment { None, Center, Left, Right, }

2
TrueType字体中不存在附加符号的字距调整功能, 因此,您必须自己定义附加符号的对应列表,并提供相应的字距调整。在大多数字母中,附加符号位于中心位置,在其他一些字母中则位于右侧。显然,Text Block可以实现上述功能。

请问您能否回答我的问题 - Maria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接