2010-02-17 7 views
2

Возможно ли локализовать нижний колонтитул DataPager (Страница X of Y) в Silvelright?Локализация Silverlight DataPager

Эти строки, по-видимому, расположены в ресурсах, встроенных в сборку DataPager. Итак, как мне его локализовать?

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

ответ

0

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

Решение основано на this article.

Поскольку файл System.Controls.Data.dll подписан MS, мне необходимо удалить подпись (сильное имя). Я использовал AdmiralDebilitate, чтобы удалить его.

  1. Скопируйте System.Controls.Data.dll в папку temp.
  2. Используйте AdmiralDebilitate, чтобы открыть dll, нажмите «Отметить все», а затем «Применить изменения». Это должно удалить сильное имя, которое предотвратит работу исправленной dll с пользовательскими ресурсами.
  3. Открыть Visual Studio Command Prompt в папке temp.
  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. Готово.

Есть две возможные проблемы:

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

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

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

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

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

0

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

<TextBlock Text="{Binding PageCount, RelativeSource={RelativeSource TemplatedParent}, StringFormat='/ \{0\}'}" VerticalAlignment="Center" Foreground="{TemplateBinding Foreground}" /> 
Смежные вопросы