是否可以在Silvelright中本地化DataPager的頁腳(Y的第X頁)?Silverlight DataPager本地化
這些字符串似乎位於嵌入DataPager組件中的資源中。那麼我應該如何本地化呢?
不幸的是,DataPager類中幾乎沒有任何內容是虛擬的,而且它也使用了許多內部類,所以不可能(至少很容易)繼承DataPager並覆蓋行爲。
是否可以在Silvelright中本地化DataPager的頁腳(Y的第X頁)?Silverlight DataPager本地化
這些字符串似乎位於嵌入DataPager組件中的資源中。那麼我應該如何本地化呢?
不幸的是,DataPager類中幾乎沒有任何內容是虛擬的,而且它也使用了許多內部類,所以不可能(至少很容易)繼承DataPager並覆蓋行爲。
因此,有另一種解決方案 - 改變資源的DLL。
該解決方案基於this article。
由於System.Controls.Data.dll是由MS簽名的,我需要刪除簽名(強名稱)。我用AdmiralDebilitate刪除它。
拆卸通過命令的dll
反彙編/out=System.Controls.Data.il System.Controls.Data.dll
使用的任何資源編輯器(我用Resource.net)打開System.Windows .Controls.DataPager.PagerResources.resources。
由命令重新組裝組件
ILASM /resource=System.Controls.Data.res/DLL /output=System.Controls.Data.dll System.Controls.Data.il
DONE。
有兩種可能出現的問題:
到目前爲止我發現的唯一解決方案是編輯DataPager的模板,刪除負責顯示「Page」和「X」的兩個文本框並創建新的文本框。然後,繼承DataPager,重寫OnApplyTemplate以附加到新的TextBoxes。
最後一部分是最棘手的 - 你必須處理你的數據源的適當事件(它取決於數據源)並更新新文本框的文本。
雖然這種解決方案應該工作,它是不是很漂亮?
這很簡單。看我怎麼本地化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);
}
}
}
}
只需添加你需要在項目文件中的SupportedCultures元素,例如文化
<SupportedCultures>en,de</SupportedCultures>
現在DataPager在德國計算機上使用德國資源。
另一種方法是刪除「後綴」文本塊,並在自己的添加與結合DataPager的的PageCount屬性:
<TextBlock Text="{Binding PageCount, RelativeSource={RelativeSource TemplatedParent}, StringFormat='/ \{0\}'}" VerticalAlignment="Center" Foreground="{TemplateBinding Foreground}" />
不幸的是,這並沒有爲我工作。我想這是因爲組裝中除了英語之外沒有別的資源。 – gius 2010-07-11 11:58:42