2010-02-17 6 views
2

Est-il possible de localiser le pied de page de DataPager (page X de Y) dans Silvelright?Localisation Silverlight DataPager

Les chaînes semblent se situer dans des ressources intégrées dans l'assemblage de DataPager. Alors, comment dois-je localiser?

Malheureusement, presque rien dans la classe DataPager n'est virtuel et aussi de nombreuses classes internes sont utilisées par elle, il n'est donc pas possible (au moins facilement) d'hériter de DataPager et de surcharger le comportement.

Répondre

0

Donc, il y a une autre solution - la modification des ressources dans la DLL. La solution est basée sur le this article.

Étant donné que le fichier System.Controls.Data.dll est signé par MS, j'ai dû supprimer la signature (nom fort). J'ai utilisé AdmiralDebilitate pour l'enlever.

  1. Copiez System.Controls.Data.dll dans un dossier temporaire.
  2. Utilisez AdmiralDebilitate pour ouvrir la DLL, cliquez sur Tout marquer, puis sur Appliquer les modifications. Cela devrait supprimer le nom fort qui empêcherait la DLL corrigée avec des ressources personnalisées de fonctionner.
  3. Ouvrez l'invite de commandes Visual Studio dans le dossier temp.
  4. démonter la dll par commande

    ildasm /out=System.Controls.Data.il System.Controls.Data.dll

  5. Utilisation d'un éditeur de ressource (I utilisé Resource.net) pour ouvrir System.Windows .Controls.DataPager.PagerResources.resources.

  6. Modifiez les chaînes de ressources souhaitées. Enregistrez le fichier de ressources et fermez l'éditeur.
  7. réassembler le montage par commande

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

  8. Terminé.

Il y a deux problèmes possibles:

  • Vous devez vous assurer que VS utilise cette DLL et non l'original du GAC. Cela peut être assuré en ouvrant le fichier .csproj dans le bloc-notes et en vérifiant le chemin de référence.
  • Si vous utilisez d'autres assemblys MS dépendants du patch, vous devrez également les patcher (AdmiralDebilitate devrait vous aider).
0

La seule solution que j'ai trouvée jusqu'ici est d'éditer le modèle de DataPager, de supprimer les deux zones de texte responsables de l'affichage de "Page" et "de X" et d'en créer de nouvelles. Ensuite, héritez de DataPager, remplacez OnApplyTemplate pour vous connecter à vos nouveaux TextBox.

La dernière partie est la plus difficile - vous devez gérer les événements propres à votre source de données (cela dépend de la source de données) et mettre à jour le texte de vos nouvelles zones de texte.

Bien que cette solution devrait fonctionner, il est très agréable ...

4

C'est assez simple. Voyez comment je DataPager localisé pour la langue portugaise:

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

Il suffit d'ajouter les cultures dont vous avez besoin à l'élément SupportedCultures dans le fichier de projet, par exemple

<SupportedCultures>en,de</SupportedCultures> 

Maintenant, le DataPager utilise des ressources allemandes sur des ordinateurs allemands.

+0

Malheureusement, cela ne fonctionne pas pour moi. Je suppose que la raison en est qu'il n'y a tout simplement pas d'autres ressources que l'anglais dans l'assemblée. – gius

0

Une autre option est de supprimer le « suffixe » textblock et ajoutez dans votre propre avec un liant à la propriété NbPages du DataPager:

<TextBlock Text="{Binding PageCount, RelativeSource={RelativeSource TemplatedParent}, StringFormat='/ \{0\}'}" VerticalAlignment="Center" Foreground="{TemplateBinding Foreground}" /> 
Questions connexes