2

SilvelrightでDataPagerのフッター(YのページX)をローカライズすることは可能ですか?

文字列は、DataPagerのアセンブリに埋め込まれているリソースにあるようです。では、どのようにローカライズする必要がありますか?

残念ながら、DataPagerクラスにはほとんど何も仮想化されておらず、多くの内部クラスが使用されているため、DataPagerを継承して動作をオーバーライドすることは(少なくとも簡単には)できません。

4

5 に答える 5

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);
        }
    }
}

}

于 2010-04-23T13:42:29.667 に答える
0

プロジェクトファイルのSupportedCultures要素に必要なカルチャを追加するだけです。

<SupportedCultures>en,de</SupportedCultures>

現在、DataPagerはドイツのコンピューターでドイツのリソースを使用しています。

于 2010-07-09T00:54:02.187 に答える
0

もう1つのオプションは、「サフィックス」テキストブロックを削除し、DataPagerのPageCountプロパティへのバインディングを使用して独自のテキストブロックを追加することです。

<TextBlock Text="{Binding PageCount, RelativeSource={RelativeSource TemplatedParent}, StringFormat='/ \{0\}'}" VerticalAlignment="Center" Foreground="{TemplateBinding Foreground}" />
于 2011-12-20T00:00:39.847 に答える
0

私がこれまでに見つけた唯一の解決策は、DataPagerのテンプレートを編集し、「Page」と「of X」の表示を担当する2つのテキストボックスを削除して、新しいテキストボックスを作成することです。次に、DataPagerを継承し、OnApplyTemplateをオーバーライドして、新しいTextBoxにアタッチします。

最後の部分は最もトリッキーです。データソースの適切なイベントを処理し(データソースによって異なります)、新しいテキストボックスのテキストを更新する必要があります。

このソリューションは機能するはずですが、あまり良くありません...

于 2010-02-17T16:34:46.137 に答える
0

したがって、別の解決策があります。DLL内のリソースを変更することです。

解決策はこの記事に基づいています。

System.Controls.Data.dllはMSによって署名されているため、署名(厳密な名前)を削除する必要がありました。AdmiralDebilitateを使用して削除しました。

  1. System.Controls.Data.dllを一時フォルダーにコピーします。
  2. AdmiralDebilitateを使用してdllを開き、[すべてマーク]をクリックしてから[変更を適用]をクリックします。これにより、カスタムリソースを使用してパッチが適用されたdllが機能しなくなるような厳密な名前が削除されます。
  3. 一時フォルダーでVisualStudioコマンドプロンプトを開きます。
  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. 終わり。

考えられる問題は2つあります。

  • VSがGACの元のDLLではなく、このDLLを使用していることを確認する必要があります。これは、メモ帳で.csprojファイルを開き、参照パスを確認することで確認できます。
  • パッチが適用されたものに依存する他のMSアセンブリを使用する場合は、それらにもパッチを適用する必要があります(AdmiralDebilitateが役立つはずです)。
于 2010-03-12T10:22:04.760 に答える