设置全局 NumberDecimalSeperator/Culture - WPF XAML
Setting global NumberDecimalSeperator / Culture - WPF XAML
我有一个非常非常小的问题,在 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)));
}
这是行不通的。 DateTime
和 Decimal
我的 gui 值不受影响,无论我在做什么。
我让它可以与 CultureAndRegionInfoBuilder
一起使用,但它需要管理权限。这不是我想要的。
有什么建议吗?
谢谢
您只能将 FrameworkElement.Language
属性 设置为 语言 ,但不能设置为自定义 CultureInfo
。 CultureInfo.CurrentCulture.IetfLanguageTag
returns 不受 NumberFormat
或 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;
}
}
然后您可以将所有当前绑定替换为您的自定义标记扩展,例如:
<TextBlock Text="{local:CustomBinding Date}" />
我有一个非常非常小的问题,在 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)));
}
这是行不通的。 DateTime
和 Decimal
我的 gui 值不受影响,无论我在做什么。
我让它可以与 CultureAndRegionInfoBuilder
一起使用,但它需要管理权限。这不是我想要的。
有什么建议吗? 谢谢
您只能将 FrameworkElement.Language
属性 设置为 语言 ,但不能设置为自定义 CultureInfo
。 CultureInfo.CurrentCulture.IetfLanguageTag
returns 不受 NumberFormat
或 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;
}
}
然后您可以将所有当前绑定替换为您的自定义标记扩展,例如:
<TextBlock Text="{local:CustomBinding Date}" />