Question

J'ai un contrôle que nous pourrions identifier comme similaire au contrôle Listbox. Chaque élément est représenté avec un seul élément (exemple TextBlock). Ce que je voudrais, c'est changer la disposition de cet élément, de sorte qu'il contient deux blocs de texte. Je crée donc un ControlTemplate, je mets une grille de bordure, TwotextBlocks, et tout va bien. Maintenant le problème:

J'ai besoin de pouvoir localiser le texte dans l'élément, et j'ai fait cela normalement comme ceci:

<... Text="{Binding Strings.SomeString, Source={StaticResource ApplicationResources}}" />

Maintenant, je dois être en mesure de faire de même avec les deux TextBlocks. J'ai donc pensé que je devais créer un type personnalisé auquel cet élément se liera et exposer deux propriétés: titre et description. Si j'expose ces propriétés en tant que type de chaîne, tout fonctionne bien, mais je perds la liaison du balisage que j'ai utilisé précédemment. Comment réaliser la même chose avec deux propriétés? Le résultat devrait être comme:

<... Title="{Binding Strings.SomeString, Source={StaticResource ApplicationResources}}", Description="{Binding Strings.AnotherString, Source={StaticResource ApplicationResources}}" />

J'ai pu faire fonctionner la localisation avec ResourceMManager, mais cela devient encore compliqué afin de fournir une localisation à appliquer dynamiquement au moment de l'exécution.

Alors, que dois-je faire pour pouvoir utiliser le code ci-dessus? Ensuite, j'ai juste besoin de mettre en œuvre InotifyPropertyChanged sur ApplicationResource et tout est défini.

Était-ce utile?

La solution

Super!

Je vais faire la même chose que vous avez fait ici. Oui, j'ai une solution mais je ne sais pas si cela fonctionne jusqu'à présent.

Premièrement, nous avons besoin d'un LocalizationManager qui détient un dictionnaire.

Par exemple, si vous devez localiser une fenêtre de compte d'utilisateur, faites-le simplement

<TextBlock Text="something, UsernameKey">

Et le LocalizationManager mappera UsernameKey à "nom d'utilisateur" ou à une autre langue

Deuxièmement, une extension XAML qui trouve la valeur de la clé de LocalizationManager.

Je me demande si cette extension personnalisée pourrait dériver de l'extension de liaison, si c'est le cas, ce sera très facile, créez simplement un objet de liaison à la cible. Sinon, je pense que la maintenance d'une référence faible à l'extension uielement par XAML à la mise à jour dynamique, le texte est appropriée.

Cette solution est simple mais pas générique. Il y a une langue lue de droite à gauche. Il demande à l'application d'afficher du contenu de droite à gauche.

J'ai donc une autre solution générique mais plus complexe.

Au lieu de l'extension XAML, nous utilisons une propriété de dépendance attachée.

Fais-le comme ça:

<TextBlock LocalizationManager.LocalizationKey="UsernameKey" />

Donc, le problème est maintenant comment définir la propriété "texte" par LocalizationManager?

Nous utilisons des adaptateurs, LocalizationManager recherchera un adaptateur approprié pour le type "TextBlock"

Ainsi, lorsque l'application démarre, nous enregistrons certains adaptateurs à LocalizationManager:

LocalizationManager.Current.RegisterAdapter<TextBlock>(new TextBlockAdapter())

Cette solution est plus générique, elle prend en charge tout type de contrôle si vous fournissez un adaptateur, mais comme vous le voyez, cette solution a besoin de plus de travail et beaucoup plus complexe que la première.

J'espère que ces solutions de conception pourraient vous aider ~

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top