是否可以在Silvelright中本地化DataPager的页脚(Y页X)?
字符串似乎位于DataPager程序集中嵌入的资源中。那么我应该如何本地化呢?
不幸的是,DataPager类中几乎没有任何东西是虚拟的,并且它也使用了许多内部类,因此不可能(至少很容易)继承DataPager并覆盖行为。
答案 0 :(得分: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);
}
}
}
}
答案 1 :(得分:0)
到目前为止,我发现的唯一解决方案是编辑DataPager模板,删除负责显示“Page”和“of X”的两个文本框并创建新文本框。然后,继承DataPager,重写OnApplyTemplate以附加到新的TextBox。
最后一部分是最棘手的 - 您必须处理数据源的正确事件(它取决于数据源)并更新新文本框的文本。
虽然这个解决方案应该有用,但它不是很好......
答案 2 :(得分:0)
因此,还有另一种解决方案 - 更改DLL中的资源。
解决方案基于this article。
由于System.Controls.Data.dll由MS签名,我需要删除签名(强名称)。我使用AdmiralDebilitate删除它。
通过命令
反汇编dllildasm /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
完成。
有两个可能的问题:
答案 3 :(得分:0)
只需将您需要的文化添加到项目文件中的SupportedCultures元素,例如
<SupportedCultures>en,de</SupportedCultures>
现在,DataPager在德国计算机上使用德语资源。
答案 4 :(得分:0)
另一种选择是删除“后缀”文本块并使用对DataPager的PageCount属性的绑定添加到您自己的文本块中:
<TextBlock Text="{Binding PageCount, RelativeSource={RelativeSource TemplatedParent}, StringFormat='/ \{0\}'}" VerticalAlignment="Center" Foreground="{TemplateBinding Foreground}" />