XAML中的WPF StringFormat和本地化

时间:2013-01-24 12:23:11

标签: c# .net wpf localization string-formatting

操作系统:WP8

我正在尝试格式化一个字符串,这是转换器进行绑定的结果。所有这些都有效,除了字符串格式数据的本地化,我没有最简单的想法如何合并。微软的文档在这方面并不是那么清楚,我想知道是否有人可以指出我正确的方向。

<TextBlock Text="{Binding Date, StringFormat='Received On: {0}', ConverterParameter=shortdatewithyear, Converter={StaticResource DateTimeToTimeConvert}}"/>

它看起来并不像是完全不想做的事情。

谢谢!

-Cord

2 个答案:

答案 0 :(得分:2)

在您的特定情况下,我将字符串从转换器中的资源文件中拉出来,然后.Net提供的本地化可以工作。在构建字符串的过程中,这可能更为重要,而构建字符串的顺序可能会在不同的语言中发生变化。

您以标准方式创建资源文件 - “MyResource.resx”以存储默认语言的字符串,然后您可以创建名为“MyResource.Fr-fr.resx”的本地化版本(如果您是做法语)。这将在第一个实例中自动加载和搜索字符串。如果找不到,则代码将从默认资源文件中提取字符串。这样您就不必翻译所有内容 - 对于US / GB拼写差异很有用。

通常,一旦你有了这个,你就可以在你的XAML

中拥有本地化的字符串

添加Localize类:

public class Localize : INotifyPropertyChanged
{
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyChange(String name)
    {
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(name));
    }

    #endregion

    #region 'Public Properties'

    //Declarations
    private static Resources.MyResources _myResources = new Resources.MyResources();

    public Resources.MyResources myResources
    {
        get { return _myResources; }
        set { NotifyChange("MyResources"); }
    }

    #endregion
}

然后在您的XAML中将此添加到您的用户控件的资源中:

<local:Localize x:Key="myResource"
                xmlns:local="clr-namespace:MyProject" />

然后你可以使用它:

<TextBlock Text="{Binding myResource.MyString, Source={StaticResource myResource}}"/>

答案 1 :(得分:0)

在不使用其他转换器或修改底层模型的情况下处理此问题的一种方法是将字符串拆分为两个单独的UI元素。例如TextBlock内的两个StackPanel,如下所示:

<StackPanel Orientation="Horizontal">
    <TextBlock Text="{x:Static properties:Resources.ReceivedOn}" Margin="0,0,5,0"/>
    <TextBlock Text="{Binding Date, ConverterParameter=shortdatewithyear, Converter={StaticResource DateTimeToTimeConvert}}"/>
</StackPanel>

通过这种方式,您可以对字符串使用正常本地化&#34; 收到:&#34;