Indices
屬性的語法在MSDN的Glyphs.Indices文檔的備註部分進行了說明。
每個字形規範具有以下形式。
[GlyphIndex][,[Advance][,[uOffset][,[vOffset][,[Flags]]]]]
圍繞每個字段中的[]
意味着是是可選的。因此,所有字段都是可選的,這意味着字形索引規範可能完全是空的。
該示例中的值";;;;;(2:1)191"
由六個這樣的規格組成,它們之間用分號隔開,其中前五個是空的。如果字形索引規範爲空,則WPF將從GlyphTypeface.CharacterToGlyphMap
屬性中檢索實際字形索引。
的文檔還說
集羣中的第一個字形的規格是由多少字形和多少碼點組合以 形式羣集一個 規範之前。
這就是前綴(2:1)
的含義。它指定源字符串中的兩個字符被一個字形替換。當然,該字形的索引號爲191
。
字形索引本身就是所選字體中特定字形的索引。在示例中,字體Times.ttf
中索引位置191處的fi
連字字形(單個字形)。
在你的波斯語字符的例子中,這一切都取決於你使用的字體。您必須對其進行調查才能找到適合這兩個字符的替換字形。將第二個字形替換爲其他字形也許就足夠了,在這種情況下,您可以省略(2:1)
規範並只寫出適當的字形索引。
UPDATE:一個非常簡單的工具來檢查所有的字形的字體文件可以這樣寫:
<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; }
}
感謝您的解釋。其實我的問題是關於如何調查字體來獲取索引。我找不到任何文件。我知道它與一些表格有關,但沒有更多。如果你也解釋了這部分,我將不勝感激(對不起,如果我的問題不是很清楚)。 – Ramin
這似乎是困難的一部分。微軟有一個名爲[VOLT](http://www.microsoft.com/typography/volt.mspx)的工具,但我無法使它加載我的Window 8系統上的字體,儘管它們在那裏。 – Clemens