Локализация Silverlight DataPager - PullRequest
       9

Локализация Silverlight DataPager

2 голосов
/ 17 февраля 2010

Можно ли локализовать нижний колонтитул DataPager (Страница X из Y) в Silvelright?

Кажется, что строки расположены в ресурсах, встроенных в сборку DataPager. Так как мне его локализовать?

К сожалению, в классе DataPager почти ничего не является виртуальным, а также используется многими внутренними классами, поэтому невозможно (по крайней мере, легко) наследовать DataPager и переопределить поведение.

Ответы [ 5 ]

4 голосов
/ 23 апреля 2010

Это довольно просто. Посмотрите, как я локализовал 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 голосов
/ 20 декабря 2011

Другой вариант - удалить текстовый блок «суффикс» и добавить свой собственный с привязкой к свойству PageCount DataPager:

<TextBlock Text="{Binding PageCount, RelativeSource={RelativeSource TemplatedParent}, StringFormat='/ \{0\}'}" VerticalAlignment="Center" Foreground="{TemplateBinding Foreground}" />
0 голосов
/ 09 июля 2010

Просто добавьте нужные вам культуры в элемент SupportedCultures в файле проекта, например,

<SupportedCultures>en,de</SupportedCultures>

Теперь DataPager использует немецкие ресурсы на немецких компьютерах.

0 голосов
/ 12 марта 2010

Итак, есть другое решение - изменение ресурсов в DLL.

Решение основано на этой статье .

Поскольку 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. Для открытия System.Windows.Controls.DataPager.PagerResources.resources используйте любой редактор ресурсов (я использовал Resource.net ).

  6. Отредактируйте нужные вам строки ресурсов. Сохраните файл ресурсов и закройте редактор.
  7. Собрать сборку командой

    ilasm /resource=System.Controls.Data.res / dll /output=System.Controls.Data.dll System.Controls.Data.il

  8. Готово.

Возможны две проблемы:

  • Вы должны убедиться, что VS использует эту DLL, а не оригинальную из GAC. Это можно сделать, открыв файл .csproj в блокноте и проверив ссылочный путь.
  • Если вы используете любые другие сборки MS, которые зависят от исправленной, вам нужно будет также их исправлять (AdmiralDebilitate должен помочь).
0 голосов
/ 17 февраля 2010

Единственное решение, которое я обнаружил до сих пор, - это отредактировать шаблон DataPager, удалить два текстовых поля, отвечающих за отображение «Страницы» и «X», и создать новые. Затем наследуйте DataPager, переопределите OnApplyTemplate, чтобы присоединить его к новым текстовым полям.

Последняя часть самая хитрая - вы должны обрабатывать правильные события вашего источника данных (это зависит от источника данных) и обновлять текст ваших новых текстовых полей.

Хотя это решение должно работать, оно не очень приятно ...

...