Silverlight DataPager本地化

时间:2010-02-17 15:33:03

标签: silverlight localization datapager

是否可以在Silvelright中本地化DataPager的页脚(Y页X)?

字符串似乎位于DataPager程序集中嵌入的资源中。那么我应该如何本地化呢?

不幸的是,DataPager类中几乎没有任何东西是虚拟的,并且它也使用了许多内部类,因此不可能(至少很容易)继承DataPager并覆盖行为。

5 个答案:

答案 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删除它。

  1. 将System.Controls.Data.dll复制到临时文件夹。
  2. 使用AdmiralDebilitate打开dll,单击全部标记,然后单击应用更改。这应该删除强名称,该名称会阻止使用自定义资源修补的dll工作。
  3. 在临时文件夹中打开Visual Studio命令提示符。
  4. 通过命令

    反汇编dll

    ildasm /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. 完成。

  9. 有两个可能的问题:

    • 您必须确保VS使用此DLL而不是GAC中的原始DLL。这可以通过在记事本中打开.csproj文件并检查参考路径来确保。
    • 如果您使用任何其他依赖于已修补程序的MS程序集,您也需要对其进行修补(AdmiralDebilitate应该提供帮助)。

答案 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}" />