繁体   English   中英

在 WPF 中使用其他设置设置区域性

[英]Set culture with additional settings in WPF

我正在尝试将我当前的文化(具有自定义十进制符号)传递给 WPF,以便它会根据我在 Windows 中的区域和语言设置显示绑定值。

我的研究总是以类似于this的解决方案结束,它传递语言标签,但没有任何其他设置(如十进制符号)。

如何强制 WPF 使用整个当前文化而不仅仅是默认语言设置?

关于可能的解决方法的问题:

我可以以某种方式将当前文化传递给 WPF 使用的默认值转换器吗? 或者可能覆盖它们?

有几个选择。 也许最简单的方法是将要数据绑定的值包装到 screen 并为它们调用 ToString 。 例如,如果您有:

    public decimal Value
    {
        get { return this.value; }
        set
        {
            if (value == this.value) return;
            this.value = value;
            OnPropertyChanged();
        }
    }

将它包裹在您的 ViewModel 中,如下所示:

    public decimal Value
    {
        get { return this.value; }
        set
        {
            if (value == this.value) return;
            this.value = value;
            OnPropertyChanged("ValueString");
        }
    }

    public string ValueString
    {
        get { return this.value.ToString(CultureInfo.CurrentCulture); }
    }

并将您的 UI 绑定到这个新属性:

        <TextBlock x:Name="Result" Text="{Binding ValueString}" Grid.Row="0"/>

这样,您将根据计算机的文化设置自动获取格式:

十进制格式 WPF 绑定文化

另一种选择是使用此处介绍的方法: https : //stackoverflow.com/a/19796279/66988

所以你需要一个自定义的 Binding 类:

public class CultureAwareBinding : Binding
{
    public CultureAwareBinding(string path)
        : base(path)
    {
        ConverterCulture = CultureInfo.CurrentCulture;
    }
}

然后你必须在你的 XAML 中使用它:

        <TextBlock x:Name="Result" Text="{wpfApplication9:CultureAwareBinding Value}" Grid.Row="0"/>

之后,您应该会看到所需的输出:

文化转换器绑定 WPF

using System;
using System.Globalization;
using System.Threading;
using System.Windows;
using System.Windows.Markup;

namespace WPF_CultureExample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("tr-TR");
            var currentCulture = Thread.CurrentThread.CurrentCulture.Name;
            var ci = new CultureInfo(currentCulture)
            {
                NumberFormat = { NumberDecimalSeparator = "," },
                DateTimeFormat = { DateSeparator = "." }
            };
            Thread.CurrentThread.CurrentCulture = ci;
            Thread.CurrentThread.CurrentUICulture = ci;

            FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

            base.OnStartup(e);
        }
        
    }
}

您可以在 App.xaml 文件的后端代码中重新编码 OnStartup() 方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM