2013-08-30 8 views
2

создать простое приложение окна с одной кнопкойCultureInfo.CurrentCulture оленью кожу изменения во время выполнения

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show(CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol); 
    } 
} 
  • Первый раз, когда я «кнопка 1» щелчком, это шоу «$»
  • открыть панель управления> Регион и язык, чтобы изменить символ валюты от «$» в «€»
  • Нажмите «кнопку 1» снова, он также показывает «$» ==> мой ожидаемый результат «€»

Кажется, что CultureInfo.CurrentCulture не изменяется во время выполнения. Может кто-нибудь предоставить мне другой вар, чтобы получить денежный формат текущего окна

ответ

4

Запустить первый:

CultureInfo.CurrentCulture.ClearCachedData();

Тогда сделайте свое сообщение.

Мне просто интересно узнать, почему вам нужны живые обновления из информации о культуре? Я думаю, что средний пользователь установит это однажды в Windows и загрузит их приложения.

+0

Это работает для меня.Спасибо – TrBaPhong

2

Культура устанавливается за нить. Основной поток создается при запуске приложения, поэтому он не изменяется позже, когда вы меняете настройки своей ОС во время работы приложения.

Из документации MSDN по адресу CultureInfo class.

Культура и Темы

Когда запускается новый поток приложения, его текущая культура и текущей культуры пользовательского интерфейса определяются текущей культуры системы, а не по текущей культуре потока. Следующий пример иллюстрирует разницу . Он устанавливает текущую культуру и текущую культуру пользовательского интерфейса для прикладной нити для французской (французской) культуры (fr-FR). Если текущая культура уже является fr-FR, пример устанавливает ее на английском языке (Соединенные Штаты) культуры (en-US). Он отображает три случайных числа как значений валюты, а затем создает новый поток, который, в свою очередь, отображает еще три случайных числа в виде значений валюты. Но, как показывает вывод , приведенный в примере, значения валюты, отображаемые новым потоком , не отражают соглашений о форматировании французской культуры (Франция), в отличие от выхода из основного потока приложений.

+1

+1 для заметок о gotchas с несколькими потоками – jdphenix

3

Редактировать: Отсоединить обработчик событий до выхода программы. Я изменил код, чтобы отразить эту необходимость. См. documentation для UserPreferenceChanged.

Вы можете слушать изменение культуры. Зарегистрируйтесь на Microsoft.Win32.SystemEvents.UserPreferenceChanged и сделайте то, что вам нужно.

public partial class Form1 : Form { 
    public Form1() { 
    InitializeComponent(); 
    SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged; 
    } 

    void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e) { 
    if (e.Category == UserPreferenceCategory.Locale) { 
     CultureInfo.CurrentCulture.ClearCachedData(); 
    } 
    } 

    private void button1_Click(object sender, EventArgs e) { 
    MessageBox.Show(CultureInfo.CurrentUICulture.NumberFormat.CurrencySymbol); 
    } 

    private void Form1_FormClosed(object sender, FormClosedEventArgs e) { 
    SystemEvents.UserPreferenceChanged -= SystemEvents_UserPreferenceChanged; 
    } 
} 

CultureInfo Documentation

SystemEvents Documentation

Смежные вопросы