簡體   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