该属性的语法在 MSDN 中Glyphs.Indices文档Indices
的备注部分中进行了说明。
每个字形规范具有以下形式。
[GlyphIndex][,[Advance][,[uOffset][,[vOffset][,[Flags]]]]]
每个[]
字段周围的表示是可选的。因此,所有字段都是可选的,这意味着字形索引规范可能完全为空。
示例中的值";;;;;(2:1)191"
由六个这样的规范组成,用分号分隔,其中前五个为空。如果字形索引规范为空,WPF 将从GlyphTypeface.CharacterToGlyphMap
属性中检索实际的字形索引。
该文件还说
集群中第一个字形的规范之前是对多少个字形和多少代码点组合形成集群的规范。
这就是前缀的(2:1)
意思。它指定源字符串中的两个字符被一个字形替换。当然,那个字形有 index 191
。
字形索引本身就是所选字体中特定字形的索引。在示例中,它是fi
字体中索引位置 191 处的连字字形(单个字形)Times.ttf
。
在您的波斯字符示例中,这完全取决于您使用的字体。您必须对其进行调查,以便为这两个字符找到合适的替换字形。将第二个字形替换为其他字形也可能就足够了,在这种情况下,您可以省略(2:1)
规范并只编写适当的字形索引。
更新:检查字体文件中所有字形的一个非常简单的工具可以这样编写:
<ListBox ItemsSource="{Binding GlyphItems}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Glyphs FontUri="{Binding FontUri}" Indices="{Binding Indices}"
FontRenderingEmSize="36" OriginX="10" OriginY="36"
Fill="Black"/>
<TextBlock Grid.Column="1" VerticalAlignment="Center"
Text="{Binding Indices, StringFormat=Index {0}}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
GlyphItems = new List<object>();
var font = @"C:\WINDOWS\Fonts\TIMES.TTF";
for (int i = 0; i < new GlyphTypeface(new Uri(font)).GlyphCount; i++)
{
GlyphItems.Add(new { FontUri = font, Indices = i.ToString() });
}
DataContext = this;
}
public List<object> GlyphItems { get; set; }
}