Récupère les valeurs des fichiers * .resx dans XAML

Est-il possible d’append une valeur à partir du fichier de ressources directement dans le balisage XAML? Ou pour la localisation, nous devons toujours faire quelque chose comme ceci dans le fichier * .cs:

txtMessage.Text = Messages.WarningUserMessage; 

Where Messages est une ressource et txtMessage est TextBlock.

Assurez-vous que Code Generation est défini sur Public dans l’éditeur resx, vous pouvez simplement utiliser:

  

C’est beaucoup plus facile de le faire comme ça. Ajoutez un fichier xmlns dans le fichier XAML et utilisez directement les ressources.

 xmlns:resx="clr-namespace:wpfapplicationname.Properties" Title="{x:Static resx:Resources.name}" 

Je comprends que ma réponse est un peu tard, mais je pensais que cela valait la peine de partager:

Pour utiliser une chaîne stockée dans un fichier * .resx sans mot-clé statique:

  1. Dans App.Xaml, ajoutez un espace de noms pour les propriétés xmlns:resource="clr-namespace:YourProject.Properties"
  2. Dans ApplicationResources (fichier app.xaml) Ajoutez une ressource pour votre fichier * .resx

  3. Dans votre fichier XAML, utilisez la liaison suivante, prenons un exemple de titre de fenêtre

    Title="{Binding TitleSsortingng, Source={StaticResource ResourceKey=ApplicationSsortingngResources}}"

    TitleSsortingng est le nom de SsortingngProperty dans votre fichier * .resx

  4. Enfin, n’oubliez pas de changer le modificateur d’access au fichier de ressources en Public.

Prendre plaisir 🙂

Le moyen le plus simple est probablement de référencer directement les éléments (ce sont des propriétés statiques, internes par défaut):

  

Si vous travaillez sur une application WPF localisée, je vous recommande de consulter les instructions sur CodePlex à l’ adresse http://wpflocalization.codeplex.com/ et si vous créez une application composite (à l’aide de PRISM ou de MEF). J’ai ensuite un billet de blog sur une manière agréable de réaliser la localisation de WPF en utilisant des liaisons standard .

Après une journée entière de recherche ce commentaire Localisation Xaml: Utiliser des ressources .resx dans Xaml sans x: static J’ai trouvé une solution simple pour fournir un support multilingue avec (ressources incorporées ou assemblage référencé) * .resx – fichiers. Depuis Framework 4, il existe une classe de base appelée DynamicObject pour spécifier le comportement dynamic à l’exécution dans l’espace de noms System.Dynamic.

J’ai dérivé de ResourceLoader à partir de System.Dynamic.DynamicObject – class:

 public class ResourceLoader : DynamicObject { #region Fields --------------------------------------------------------------- private const ssortingng DefaultResourcesSuffix = "Resource"; private ResourceManager _resourceMan; private CultureInfo culture; private readonly ssortingng _defaultAssemblyName; private readonly Assembly _defaultAssembly; private Assembly theAssembly; private ssortingng resourcesSuffix; private ssortingng assembly; #endregion // Fields #region Properties ----------------------------------------------------------- ///  /// Gets or sets the assembly. ///  public ssortingng Assembly { get { return assembly; } set { assembly = value; theAssembly = System.Reflection.Assembly.Load(assembly); _resourceMan = null; } } ///  /// Gets or sets the resources suffix. ///  public ssortingng ResourcesSuffix { get { return resourcesSuffix; } set { resourcesSuffix = value; _resourceMan = null; } } ///  /// Get, set culture ///  public CultureInfo CurrentCulture { get { this.culture = this.culture ?? CultureInfo.InvariantCulture; return this.culture; } set { this.culture = value; } } ///  /// Creates new instace of  at initialisation or change of . ///  private ResourceManager ResourceManager { get { if (ReferenceEquals(_resourceMan, null)) { ResourceManager temp = new ResourceManager( ssortingng.Format("{0}.{1}", Assembly ?? _defaultAssemblyName, ResourcesSuffix ?? DefaultResourcesSuffix), theAssembly ?? _defaultAssembly); _resourceMan = temp; } return _resourceMan; } } #endregion // Properties #region Methods -------------------------------------------------------------- private object GetResource(ssortingng name, CultureInfo language) { if (language == null || language == CultureInfo.InvariantCulture) return ResourceManager.GetObject(name); return ResourceManager.GetObject(name, language); } ///  /// Provides the implementation for operations that get member values. Classes derived from the  class can override this method to specify dynamic behavior for operations such as getting a value for a property. ///  /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the  class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . ///  /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a run-time exception is thrown.) ///  public override bool TryGetMember(GetMemberBinder binder, out object result) { result = GetResource(binder.Name, this.culture); if (result != null && result.GetType() == typeof(System.Drawing.Bitmap)) { System.Drawing.Bitmap currentBmp = result as System.Drawing.Bitmap; currentBmp.MakeTransparent(System.Drawing.Color.Magenta); BitmapSource src = Imaging.CreateBitmapSourceFromHBitmap(currentBmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); result = src; } return result == null ? false : true; } ///  /// Switch set culture ///  public void SwitchCulture(CultureInfo NewCulture) { this.culture = NewCulture; } #endregion // Methods #region Constructors --------------------------------------------------------- ///  /// Initializes a new instance of the  class. ///  public ResourceLoader() : this(CultureInfo.InvariantCulture, DefaultResourcesSuffix) { } ///  /// Initializes a new instance of the  class. ///  public ResourceLoader(CultureInfo InitCulture, ssortingng ResourceSuffix) { _defaultAssemblyName = GetType().Assembly.GetName().Name; _defaultAssembly = GetType().Assembly; this.culture = InitCulture; this.resourcesSuffix = ResourceSuffix; } #endregion // Constructors } 

Vous pouvez créer une instance dans xaml comme ceci:

     

Code C #:

  ///  /// Interaction logic for Window1.xaml ///  public partial class Window1 : Window { private ResourceLoader res; public Window1() { InitializeComponent(); // load it from WPF Resources this.res = (ResourceLoader)this.FindResource("resource"); // or create an instance //this.res = new ResourceLoader(CultureInfo.InvariantCulture, "Resource"); this.LayoutRoot.DataContext = res; } private void btnSwichLanguage_Click(object sender, RoutedEventArgs e) { res.SwitchCulture(new CultureInfo("de")); this.LayoutRoot.DataContext = null; this.LayoutRoot.DataContext = res; } } 

Maintenant, il est possible de lier des chaînes et des images (les images seront converties dans BitmapSource:

       

Le moyen le plus simple, où vous pouvez définir la largeur de la zone de texte également en fonction de la longueur du texte dans chaque langue.

Code Xaml

  

Consultez le fichier de ressources: – Cliquez sur Afficher

Masquer un autre bloc de texte et lier son texte Dans ce bloc de texte, vous aurez la ressource de .cs