我正在設計一個字體串列,其中我指的是 Fonts.SystemFontFamilies,但我還想包含 3 種存在于我的 MyDllProject 專案中的自定義字體。首先我添加 SystemFontFamilies,并且效果很好,然后我添加了我的自定義字體(Roboto、Abstractus 和 OpenSans)并將它們很好地添加到串列中,但它給了我前綴./#。所以,我想找到一種方法來顯示字體的名稱,就像 Abstractus、Roboto 和 Open Sans 一樣,沒有別的。
組合框的代碼是
if( _cmbFontFamilies != null )
{
_cmbFontFamilies.ItemsSource = FontUtilities.Families.OrderBy( fontFamily => fontFamily.Source );
}
FontUtilities 的代碼是
internal class FontUtilities
{
internal static IEnumerable<FontFamily> Families
{
get
{
foreach ( FontFamily font in Fonts.SystemFontFamilies)
{
yield return font;
}
foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new
Uri("pack://application:,,,/MyDllProject ;Component/Resources/")))
{
yield return fontFamily;
}
}
}
}
我得到的結果。

uj5u.com熱心網友回復:
FontFamily回傳的每個結果物件Fonts.GetFontFamilies都有一個友好名稱的形式"./#Family Name"。這個友好的名稱設定了一個Source屬性,屬性FontFamily的值Source由FontFamily.ToString()方法回傳。
我會創建一個自定義類 FontName
public class FontName
{
public string Name { get; set; }
public string Source { get; set; }
}
并回傳FontNameby的集合FontUtilities.Families。加載自定義字體時洗掉前綴"./#"
internal class FontUtilities
{
internal static IEnumerable<FontName> Families
{
get
{
foreach ( FontFamily font in Fonts.SystemFontFamilies)
{
yield return new FontName { Name = font.Source, Source = font.Source };
}
foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new
Uri("pack://application:,,,/MyDllProject ;Component/Resources/")))
{
yield return new FontName { Name = fontFamily.Source.Replace("./#", string.Empty), Source = fontFamily.Source };
}
}
}
}
if( _cmbFontFamilies != null )
{
_cmbFontFamilies.SelectedValuePath = "Source";
_cmbFontFamilies.DisplayValuePath = "Name";
_cmbFontFamilies.ItemsSource = FontUtilities.Families.OrderBy( fontFamily => fontFamily.Source );
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/313952.html
