Подтвердить что ты не робот

WPF StringFormat = {0: C}, показывающий как доллары

Почему эта строка кода

<TextBlock Text="{Binding Net, StringFormat=c}"/>

Выведите результат как $xx.xx, когда все мои региональные настройки установлены в Великобритании. Я ожидаю, что он выведет его как £ xx.xx. Есть идеи? Я пробовал разные варианты stringformat, включая StringFormat = {} {0: C}, но все равно получаю тот же результат.

Спасибо, что посмотрели.

4b9b3361

Ответ 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(я не тестировал его, хотя...)