SilvelrightでDataPagerのフッター(YのページX)をローカライズすることは可能ですか?
文字列は、DataPagerのアセンブリに埋め込まれているリソースにあるようです。では、どのようにローカライズする必要がありますか?
残念ながら、DataPagerクラスにはほとんど何も仮想化されておらず、多くの内部クラスが使用されているため、DataPagerを継承して動作をオーバーライドすることは(少なくとも簡単には)できません。
SilvelrightでDataPagerのフッター(YのページX)をローカライズすることは可能ですか?
文字列は、DataPagerのアセンブリに埋め込まれているリソースにあるようです。では、どのようにローカライズする必要がありますか?
残念ながら、DataPagerクラスにはほとんど何も仮想化されておらず、多くの内部クラスが使用されているため、DataPagerを継承して動作をオーバーライドすることは(少なくとも簡単には)できません。
それはとても簡単です。ポルトガル語用に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はドイツのコンピューターでドイツのリソースを使用しています。
もう1つのオプションは、「サフィックス」テキストブロックを削除し、DataPagerのPageCountプロパティへのバインディングを使用して独自のテキストブロックを追加することです。
<TextBlock Text="{Binding PageCount, RelativeSource={RelativeSource TemplatedParent}, StringFormat='/ \{0\}'}" VerticalAlignment="Center" Foreground="{TemplateBinding Foreground}" />
私がこれまでに見つけた唯一の解決策は、DataPagerのテンプレートを編集し、「Page」と「of X」の表示を担当する2つのテキストボックスを削除して、新しいテキストボックスを作成することです。次に、DataPagerを継承し、OnApplyTemplateをオーバーライドして、新しいTextBoxにアタッチします。
最後の部分は最もトリッキーです。データソースの適切なイベントを処理し(データソースによって異なります)、新しいテキストボックスのテキストを更新する必要があります。
このソリューションは機能するはずですが、あまり良くありません...
したがって、別の解決策があります。DLL内のリソースを変更することです。
解決策はこの記事に基づいています。
System.Controls.Data.dllはMSによって署名されているため、署名(厳密な名前)を削除する必要がありました。AdmiralDebilitateを使用して削除しました。
コマンドでdllを分解します
ildasm /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
終わり。
考えられる問題は2つあります。