2010-02-17 76 views
2

是否可以在Silvelright中本地化DataPager的頁腳(Y的第X頁)?Silverlight DataPager本地化

這些字符串似乎位於嵌入DataPager組件中的資源中。那麼我應該如何本地化呢?

不幸的是,DataPager類中幾乎沒有任何內容是虛擬的,而且它也使用了許多內部類,所以不可能(至少很容易)繼承DataPager並覆蓋行爲。

回答

0

因此,有另一種解決方案 - 改變資源的DLL。

該解決方案基於this article

由於System.Controls.Data.dll是由MS簽名的,我需要刪除簽名(強名稱)。我用AdmiralDebilitate刪除它。

  1. 將System.Controls.Data.dll複製到臨時文件夾中。
  2. 使用AdmiralDebilitate打開dll,單擊標記全部,然後應用更改。這應該刪除強大的名稱,以防止補丁DLL自定義資源的工作。
  3. 打開臨時文件夾中的Visual Studio命令提示符。
  4. 拆卸通過命令的dll

    反彙編/out=System.Controls.Data.il System.Controls.Data.dll

  5. 使用的任何資源編輯器(我用Resource.net)打開System.Windows .Controls.DataPager.PagerResources.resources。

  6. 編輯您想要的資源字符串。保存資源文件並關閉編輯器。
  7. 由命令重新組裝組件

    ILASM /resource=System.Controls.Data.res/DLL /output=System.Controls.Data.dll System.Controls.Data.il

  8. DONE。

有兩種可能出現的問題:

  • 您必須確保VS使用此DLL,而不是原來的從GAC。這可以通過在記事本中打開.csproj文件並檢查參考路徑來保證。
  • 如果您使用任何其他依賴修補的MS程序集,您也需要修補它們(AdmiralDebilitate應該有所幫助)。
0

到目前爲止我發現的唯一解決方案是編輯DataPager的模板,刪除負責顯示「Page」和「X」的兩個文本框並創建新的文本框。然後,繼承DataPager,重寫OnApplyTemplate以附加到新的TextBoxes。

最後一部分是最棘手的 - 你必須處理你的數據源的適當事件(它取決於數據源)並更新新文本框的文本。

雖然這種解決方案應該工作,它是不是很漂亮?

4

這很簡單。看我怎麼本地化DataPager的爲葡萄牙語:

using System; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Ink; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

namespace MarceloOliveira.Controls 
{ 
/// <summary> 
/// Customização feita sobre o Data Pager padrão do Silverlight, para traduzir para o português 
/// </summary> 
public class CustomDataPager : DataPager 
{ 
    TextBlock currentPagePrefixTextBlock; 
    TextBlock currentPageSuffixTextBlock; 
    TextBox currentPageTextBox; 

    public CustomDataPager() : base() 
    { 
     this.PageIndexChanged += new EventHandler<EventArgs>(CustomDataPager_PageIndexChanged); 
     this.MouseLeftButtonDown += new MouseButtonEventHandler(CustomDataPager_MouseLeftButtonDown); 
    } 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     currentPagePrefixTextBlock = GetTemplateChild("CurrentPagePrefixTextBlock") as TextBlock; 
     currentPageSuffixTextBlock = GetTemplateChild("CurrentPageSuffixTextBlock") as TextBlock; 
     currentPageTextBox = GetTemplateChild("CurrentPageTextBox") as TextBox; 
     currentPageTextBox.TextChanged += new TextChangedEventHandler(currentPageTextBox_TextChanged); 
     currentPageSuffixTextBlock.SizeChanged += new SizeChangedEventHandler(currentPageSuffixTextBlock_SizeChanged); 
    } 

    void currentPageTextBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     TranslateLabels(); 
    } 

    void CustomDataPager_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     TranslateLabels(); 
    } 

    void CustomDataPager_PageIndexChanged(object sender, EventArgs e) 
    { 
     TranslateLabels(); 
    } 

    void currentPageSuffixTextBlock_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     TranslateLabels(); 
    } 

    private void TranslateLabels() 
    { 
     if (currentPagePrefixTextBlock != null) 
     { 
      currentPagePrefixTextBlock.Text = "Pág."; 
      currentPageSuffixTextBlock.Text = string.Format("de {0}", this.PageCount); 
     } 
    } 
} 

}

0

只需添加你需要在項目文件中的SupportedCultures元素,例如文化

<SupportedCultures>en,de</SupportedCultures> 

現在DataPager在德國計算機上使用德國資源。

+0

不幸的是,這並沒有爲我工作。我想這是因爲組裝中除了英語之外沒有別的資源。 – gius 2010-07-11 11:58:42

0

另一種方法是刪除「後綴」文本塊,並在自己的添加與結合DataPager的的PageCount屬性:

<TextBlock Text="{Binding PageCount, RelativeSource={RelativeSource TemplatedParent}, StringFormat='/ \{0\}'}" VerticalAlignment="Center" Foreground="{TemplateBinding Foreground}" />