2013-01-24 45 views
3

OS:WP8WPF的StringFormat和本地化在XAML

我試圖格式的字符串是採取結合轉換器的結果。除了字符串格式數據的本地化之外,所有這些工作都是有效的,我不知道如何合併。微軟的文檔在這方面並沒有那麼清楚,我想知道是否有人能指引我朝着正確的方向發展。

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

它沒有看到這樣一個完全從牆上的事情要做。

謝謝!

-Cord

回答

2

在您的特定情況下,我拉出來串轉換器中的資源文件,然後將淨提供本地化可以工作。在構建字符串時,這可能更重要,您構建字符串的順序可能會因不同的語言而改變。

您以標準方式創建資源文件 - 「MyResource.resx」來存儲默認語言的字符串,然後您可以創建名爲「MyResource.Fr-fr.resx」的本地化版本(如果您正在做法語)。這將自動加載並在第一個實例中搜索字符串。如果沒有找到,代碼將從默認資源文件中取出字符串。這樣你就不需要翻譯所有內容 - 對美國/英國的拼寫有所不同。

一般來說,一旦你有這個你可以在你的XAML

添加本地化類具有本地化字符串:

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}}"/> 
+0

感謝。我對如何本地化應用程序有很好的把握。實際上,除StringFormat字符串之外,所有這些都完成了。正如你在前面的例子中看到的那樣,我有一個對象(在這種情況下是一個日期)通過一個轉換器發送,它根據轉換器的參數將其轉換爲一個字符串。這一切都完美。但是,如果將StringFormat參數添加到綁定中,則無法獲取初始轉換的輸出並本地化StringFormat節,在本例中爲'Received On:'字符串。 –

+0

@CordAwtry - 在這種情況下,將格式化字符串放入您的轉換器中。 – ChrisF

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> 

這樣,你可以使用字符串正常本土化「收到: