【问题标题】:How to localize a DatePicker?如何本地化 DatePicker?
【发布时间】:2012-03-28 13:02:37
【问题描述】:

在小型 Wpf 应用程序中,使用绑定到 DateTime 属性的 DatePicker。 当用户的地区和语言设置以及数字和日期格式为德语时,日期显示为德语,日历显示德语月份名称。 现在我想用美式英语获得它。在 MainWindow 的 c'tor 中,我在 InitializeComponent() 之前添加(在 InitializeComponent() 之后执行此操作时的情况相同):

string uiLanguage = ConfigurationManager.AppSettings["UILanguage"]; //"en-US"
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(uiLanguage);
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(uiLanguage)));

虽然它适用于文本框,但它对 DatePicker 无效。 然后我很狡猾,创建了一个新用户“John English”,以“John English”的身份登录,将他的显示语言设置为英语,并将日期和数字格式设置为美国英语。现在 DatePicker 始终以美国英语格式显示日期,日历显示英语月份名称,即使我将程序的语言设置为德语也是如此。 如何解决?能彻底解决吗?

【问题讨论】:

    标签: wpf localization datepicker


    【解决方案1】:

    在 App.xaml 的代码隐藏中添加以下代码:

    public App()
    {
        EventManager.RegisterClassHandler(typeof(DatePicker), DatePicker.LoadedEvent, new RoutedEventHandler(DatePicker_Loaded));
    }
    
    void DatePicker_Loaded(object sender, RoutedEventArgs e)
    {
        var dp = sender as DatePicker;
        if (dp == null) return;
    
        var tb = GetChildOfType<DatePickerTextBox>(dp);
        if (tb == null) return;
    
        var wm = tb.Template.FindName("PART_Watermark", tb) as ContentControl;
        if (wm == null) return;
    
        wm.Content = "[Put your text here]";
    }
    

    [主题;)] 尝试同时设置 CurrentCulture 和 CurrentUICulture。

    //Set default culture to Nl
    System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    

    ref 用于 GetChildOfType

    【讨论】:

    • 感谢您的提示。但这不是重点:我对用我自己的本地化文本替换“选择日期”一点也不感兴趣。 en-US 和 de-DE 的日期格式不同。当我在德语 Windows 上将应用程序的语言设置为 en-US 时,我希望看到以美式格式格式化的日期。
    • 谢谢。设置 CurrentCulture,不仅是 CurrentUICulture,成功了。
    • 错误:名称"GetChildOfType"在当前上下文中不存在
    【解决方案2】:

    在 XAML 中创建一个没有任何绑定的普通 DataGridTextColumn:

    <DataGridTextColumn x:Name="SomeDateDataGridColumn" Width="Auto" Header="Header"/> 
    

    然后在后面的代码中设置绑定和stringformat:

    SomeDateDataGridColumn.Binding = new Binding("Property") { StringFormat = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多