我有一个非常非常小的问题,在WPF中似乎无法解决。
我需要为应用程序自定义NumberFormatInfo
和DateFormatInfo
,并且不想每次使用数字或日期时都使用XAML中的StringFormat
选项。
所以我试图像这样在全球范围内对其进行全球化:
private void SetCulture()
{
var cultureInfo = CultureInfo.CurrentCulture;
if (!string.IsNullOrEmpty(Settings.Default.LanguageOverride))
cultureInfo = new CultureInfo(Settings.Default.LanguageOverride);
cultureInfo.NumberFormat.NumberDecimalDigits = 2;
cultureInfo.NumberFormat.NumberDecimalSeparator = ",";
cultureInfo.NumberFormat.NumberGroupSeparator = ".";
cultureInfo.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
cultureInfo.DateTimeFormat.FullDateTimePattern = "dd.MM.yyyy";
cultureInfo.DateTimeFormat.ShortTimePattern = "HH:mm";
cultureInfo.DateTimeFormat.LongDatePattern = "dd.MM.yyyy";
cultureInfo.DateTimeFormat.LongTimePattern = "HH:mm";
SetCulture(cultureInfo);
}
private void SetCulture(CultureInfo cultureInfo)
{
LocalizeDictionary.Instance.IncludeInvariantCulture = false;
CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
LocalizeDictionary.Instance.Culture = cultureInfo;
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
}
这不起作用。不管我在做什么,GUI上的DateTime
和Decimal
值都不会受到影响。
我知道它可以与CultureAndRegionInfoBuilder
一起使用,但是它需要管理权限。那不是我想要的。
有什么建议吗? 谢谢
答案 0 :(得分:0)
您只能将FrameworkElement.Language
属性设置为语言,而不能将其设置为自定义CultureInfo
。 CultureInfo.CurrentCulture.IetfLanguageTag
返回的语言标签不受NumberFormat
的{{1}}或DateTimeFormat
属性的影响。
您可以全局应用格式设置是定义一个自定义绑定,在此位置将CultureInfo.CurrentCulture
属性设置在一个位置:
ConverterCulture
然后您可以用自定义标记扩展名替换所有当前绑定,例如:
public class CustomBinding : Binding
{
private static readonly CultureInfo cultureInfo;
static CustomBinding()
{
cultureInfo = new CultureInfo("sv");
cultureInfo.NumberFormat.NumberDecimalDigits = 2;
cultureInfo.NumberFormat.NumberDecimalSeparator = ",";
cultureInfo.NumberFormat.NumberGroupSeparator = ".";
cultureInfo.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
cultureInfo.DateTimeFormat.FullDateTimePattern = "dd.MM.yyyy";
cultureInfo.DateTimeFormat.ShortTimePattern = "HH:mm";
cultureInfo.DateTimeFormat.LongDatePattern = "dd.MM.yyyy";
cultureInfo.DateTimeFormat.LongTimePattern = "HH:mm";
}
public CustomBinding()
{
ConverterCulture = cultureInfo;
}
public CustomBinding(string path)
: base(path)
{
ConverterCulture = cultureInfo;
}
}