【问题标题】:WPF XAML StringFormat DateTime: Output in wrong culture?WPF XAML StringFormat DateTime:以错误的文化输出?
【发布时间】:2009-06-30 07:07:43
【问题描述】:

我在输出 DateTime 值时遇到了一些问题。我计算机的当前文化设置为 de-AT(奥地利)。

以下代码

string s1 = DateTime.Now.ToString("d");
string s2 = string.Format("{0:d}", DateTime.Now);

导致 s1 和 s2 都具有正确的值“30.06.2009”。

但是当在 XAML 中使用相同的格式时

    <TextBlock Text="{Binding Source={x:Static sys:DateTime.Now}, StringFormat=d}"/>

输出是“2009 年 6 月 30 日”。 XAML StringFormat 似乎忽略了当前的文化设置。这在 Vista 和 XP 上都会发生。

我不想指定自定义格式,因为输出应该按照用户的首选文化设置进行格式化。

有人遇到同样的问题吗?这是 WPF 中的错误吗?

【问题讨论】:

标签: c# wpf xaml datetime


【解决方案1】:

【讨论】:

  • 如果你覆盖默认设置它没有帮助
【解决方案2】:

要应用http://tinyurl.com/b2jegna 中提到的解决方案,请执行以下操作:

(1) 在 app.xaml 中的 Application 类中添加 Startup 事件处理程序:

<Application x:Class="MyApp"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    ...
    Startup="ApplicationStartup">

(2)添加处理函数:

private void ApplicationStartup(object sender, StartupEventArgs e)
{
    FrameworkElement.LanguageProperty.OverrideMetadata(
        typeof(FrameworkElement),
        new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
}

然后应根据文化正确格式化 WPF 字符串。

【讨论】:

    【解决方案3】:

    前段时间在我的博客上写过:

    这将告诉你如何让 WPF 使用正确的文化:

    http://www.nbdtech.com/blog/archive/2009/02/22/wpf-data-binding-cheat-sheet-update-the-internationalization-fix.aspx

    当您在控制面板中修改设置时,这将即时更改 WPF 文化:

    http://www.nbdtech.com/blog/archive/2009/03/18/getting-a-wpf-application-to-pick-up-the-correct-regional.aspx

    【讨论】:

      【解决方案4】:

      如果您想要一种特定的语言,您可以使用xml:lang 在顶级元素上设置它。

      例如:

      <Window xml:lang="de-AT">
      ...
      </Window>
      

      【讨论】:

        【解决方案5】:

        我知道这是一个老问题,但这一直对我有用,分享知识是一件好事。由于我的应用程序总是动态更改语言,因此 FrameworkElement.LanguageProperty.OverrideMetadata 只能工作一次,对我没有好处,所以请注意:

        this.Language = System.Windows.Markup.XmlLanguage.GetLanguage(ActiveLanguage.CultureInfo.IetfLanguageTag);
        

        其中 (this) 是 MainWindow,实际上您必须在所有根元素 (Windows) 中执行此操作。 就这么简单。

        【讨论】:

          【解决方案6】:

          您可以使用 IValueConverter(它接受一个文化参数)并根据需要格式化值,我喜欢的是 Matt Hamilton 的这个可为空的转换器

          class NullableDateTimeConverter : ValidationRule, IValueConverter
          {
          public override ValidationResult Validate(object value, CultureInfo cultureInfo)
          {
              if (value == null || value.ToString().Trim().Length == 0) return null;
          
              return new ValidationResult( 
                  ConvertBack(value, typeof(DateTime?), null, cultureInfo) != DependencyProperty.UnsetValue,
                  "Please enter a valid date, or leave this value blank");
          }
          
          #region IValueConverter Members
          public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
          {
              if (value == null) return "";
              DateTime? dt = value as DateTime?;
              if (dt.HasValue)
              {
                  return parameter == null ? dt.Value.ToString() : dt.Value.ToString(parameter.ToString());
              }
              return ""; 
          } 
          
          public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
          {
              if (value == null || value.ToString().Trim().Length == 0) return null;
              string s = value.ToString();
          
              if (s.CompareTo("today") == 0) return DateTime.Today;
              if (s.CompareTo("now") == 0) return DateTime.Now;
              if (s.CompareTo("yesterday") == 0) return DateTime.Today.AddDays(-1);
              if (s.CompareTo("tomorrow") == 0) return DateTime.Today.AddDays(1);
          
              DateTime dt; 
              if (DateTime.TryParse(value.ToString(), out dt)) return dt; 
          
              return DependencyProperty.UnsetValue; 
          }  
          #endregion
          

          }

          这是original

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-14
            • 1970-01-01
            • 1970-01-01
            • 2017-03-03
            • 2010-10-05
            相关资源
            最近更新 更多