Na verdade, você pode definir a cultura de thread padrão e a cultura da interface do usuário, mas apenas com o Framework 4.5+
Eu coloquei nesse construtor estático
static MainWindow()
{
CultureInfo culture = CultureInfo
.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
var dtf = culture.DateTimeFormat;
dtf.ShortTimePattern = (string)Microsoft.Win32.Registry.GetValue(
"HKEY_CURRENT_USER\\Control Panel\\International", "sShortTime", "hh:mm tt");
CultureInfo.DefaultThreadCurrentUICulture = culture;
}
e coloque um ponto de interrupção no método Convert de um ValueConverter para ver o que chegou ao outro extremo. CultureInfo.CurrentUICulture deixou de ser en-US e tornou-se en-AU completo com meu pequeno truque para fazer respeitar as configurações regionais de ShortTimePattern.
Viva, tudo está bem no mundo! Ou não. O parâmetro de cultura passado para o método Convert ainda é en-US. Erm, WTF ?! Mas é um começo. Pelo menos assim
- você pode corrigir a cultura da interface do usuário uma vez quando o aplicativo for carregado
- é sempre acessível a partir de
CultureInfo.CurrentUICulture
string.Format("{0}", DateTime.Now)
usará suas configurações regionais personalizadas
Se você não pode usar a versão 4.5 da estrutura, desista de configurar o CurrentUICulture como uma propriedade estática de CultureInfo e defina-a como uma propriedade estática de uma de suas próprias classes. Isso não corrige o comportamento padrão de string.Format ou faz com que o StringFormat funcione corretamente nas ligações e percorre a árvore lógica do aplicativo para recriar todas as ligações no aplicativo e definir a cultura do conversor.