WPF StringFormat = {0: C}, показывающий как доллары
Почему эта строка кода
<TextBlock Text="{Binding Net, StringFormat=c}"/>
Выведите результат как $xx.xx, когда все мои региональные настройки установлены в Великобритании. Я ожидаю, что он выведет его как £ xx.xx. Есть идеи? Я пробовал разные варианты stringformat, включая StringFormat = {} {0: C}, но все равно получаю тот же результат.
Спасибо, что посмотрели.
Ответы
Ответ 1
Я не уверен, что это было исправлено в .NET 4, но WPF никогда не поднимал текущую культуру, когда делал такие вещи, как валюта или даты. Это то, что я считаю огромным недосмотром, но, к счастью, легко исправляется.
В вашем классе App:
protected override void OnStartup(StartupEventArgs e)
{
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(
CultureInfo.CurrentCulture.IetfLanguageTag)));
base.OnStartup(e);
}
Подробнее см. этот отличный пост.
Ответ 2
Я использую Language = "en-GB" в главном окне, например.
<Window x:Class="AllocateWPF.Vouchers"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Test" Height="692" Width="1000" Language="en-GB">
Ответ 3
Что для меня работает:
1) В app.xaml переопределить OnStartup() и добавить - System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("et-EE");
2) Определить на уровне XAML @Window - xmlns:sysglb="clr-namespace:System.Globalization;assembly=mscorlib"
3) В XAML - <TextBox Text="{Binding Path=Price, StringFormat='{}{0:C}', ConverterCulture={x:Static sysglb:CultureInfo.CurrentUICulture}}" />
Этот правильно выбирает региональные настройки . Хотя на первом этапе я использую созданную вручную CultureInfo, я уверен, что можно передать один из статических типов - например. System.Globalization.CultureInfo.CurrentCulture(я не тестировал его, хотя...)