我正在處理的項目有一個豐富的文本框,可以通過組合框將其字體更改爲任何系統字體。C#WPF獲取本地化的FontFamily
我們將所有來自「Fonts.SystemFontFamilies」的FontFamily對象添加爲組合框的ItemsSource。如果它們存在於每個FontFamily中,我們需要能夠顯示這些字體的本地化名稱。
我目前假設我們看到爲每個ComboBoxItem顯示的文本是我們設置爲ItemsSource的FontFamily對象的Source屬性。有沒有簡單的方法來本地化這個來源?我已經能夠得到使用本地化的名稱:
font.FamilyNames.TryGetValue(XmlLanguage.GetLanguage("ja-JP"), out name);
但FontFamily.Source是隻讀的,我無法將這個新名稱分配到的FontFamily對象。
- 更新 -
我們決定不使用包含字體系列的一類,由於與應用集成起來併發症。我想嘗試使用一個值轉換器來避免更改底層代碼。
我有以下的值轉換器類:
class FontValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
FontFamily font = (FontFamily)value;
string localizedName = font.FamilyNames[XmlLanguage.GetLanguage(culture.Name)];
if (!String.IsNullOrEmpty(localizedName))
return localizedName;
return font.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException("ConvertBack not supported");
}
}
我試圖把它綁定到ComboBoxItem對象。我們在後面的代碼中設置ItemsSource;基本上是「ItemsSource = collectionOfFonts」。我想要做的是將我的轉換器綁定到ItemsSource中的每個項目,以便它將轉換爲本地化的字體系列名稱。
我一直在考慮下面的XAML代碼:
<Style
x:Key="ComboBoxItemStyle"
TargetType="{x:Type ComboBoxItem}">
<Setter
Property="Template">
<Setter.Value>
<ControlTemplate
TargetType="{x:Type ComboBoxItem}">
<ContentPresenter
Content="{Binding Source=..., Converter={StaticResource FontValueConverter}}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
不過,我很困惑,我該怎麼綁定,因此檢索的FontFamily對象,並將其轉換爲字符串,返回的值顯示。
有什麼想法?
我會給自定義值轉換器一個走了不久。這似乎是更好的解決方案。 – Jason 2009-09-25 09:15:43
是否有可能從C#代碼而不是XAML添加值轉換器? – Jason 2009-09-28 10:50:09
您可以通過xaml註冊代碼的方式註冊代碼轉換器,例如通過在代碼中構建您的綁定而不是xaml。我不知道有任何其他方式註冊轉換器,除非通過綁定。我相信你可以直接調用它們,但是我從來沒有這樣做過,我懷疑你可以直接調用它們,並且仍然可以從枚舉值列表(或類似的列表)中獲得貨幣/數據綁定的好處使用價值轉換器。 – 2009-09-29 12:42:40