2010-08-25 23 views
2
ici

est une démonstration du problème:Comment référencer une ressource statique à partir des ressources de composants actuelles?

d'une fenêtre simple:

<Window x:Class="TestWpfStaticResource.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<TextBlock Text="{StaticResource TestString}"> 
    <TextBlock.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Resources.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </TextBlock.Resources> 
</TextBlock> 

J'essaie d'accéder à une ressource dans un ResourceDictionary:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
<sys:String x:Key="TestString">Test</sys:String> 
</ResourceDictionary> 

visuelle Studio 2010 affiche ma fenêtre avec le résultat attendu mais lors de l'exécution de l'application j'obtiens cette exception:

Cannot find resource named 'TestString'. Resource names are case sensitive. 

Remarque 1: lors de l'utilisation de DynamicResource, le résultat est correct dans VS 2010 et lors de l'exécution.

Note 2: mettre la référence au dictionnaire de ressources en dehors du TextBlock, dans les ressources Windows par exemple, donne le résultat attendu mais mon scénario réel ne le permet pas.

Alors, qu'est-ce que je fais mal et comment obtenir le résultat attendu?

RÉPONSE: après plus de tests, il semble que l'analyseur XAML est tout à fait minime et traite le contenu comme il vient, de manière séquentielle, sans essayer d'interpréter quoi que ce soit. L'ordre de déclaration est donc important: vous devez mettre la référence à la propriété "Text" APRÈS la référence au dictionnaire. Et la seule façon de faire cela semble envelopper la référence à la StaticResource dans un élément "Binding".

Merci d'avance.

Répondre

3

Je pense que le problème est que quand il essaie de trouver la ressource statique, il n'a pas encore été fusionné dans le dictionnaire de ressources actuel ... pas sûr cependant.

Faire comme cela semble fonctionner:

<TextBlock> 
     <TextBlock.Resources>  
      <ResourceDictionary> 
       <ResourceDictionary.MergedDictionaries> 
         <ResourceDictionary Source="Resources.xaml"></ResourceDictionary> 
       </ResourceDictionary.MergedDictionaries> 
      </ResourceDictionary> 
     </TextBlock.Resources> 

     <TextBlock.Text> 
      <Binding Source="{StaticResource TestString}" /> 
     </TextBlock.Text>   
    </TextBlock> 
+0

Merci pour votre réponse. En effet, cela fonctionne de cette façon, alors maintenant nous avons une solution de contournement, mais la question de ce qui se passe exactement dans ma question initiale reste. – Pragmateek

+0

Ok, après plus de tests, il semble que l'analyseur fasse un travail très minime. Je vais ajouter une réponse à ce sujet. – Pragmateek

+0

J'ai mis à jour la question originale avec plus de détails. Merci encore pour votre réponse utile. – Pragmateek