2010-03-30 14 views
3

J'ai une brosse qui fait partie d'un ResourceDictionary qui est fusionné à Application.Resources.Ressource WPF fusionnée à Application.Resources mais non résolue à l'exécution

Mais pour une raison quelconque, il n'est pas résolu au moment de l'exécution lorsqu'un style est appliqué à l'un des contrôles. Toutefois, si j'appelle Application.Current.FindResource ("BrushName") à partir de la fenêtre Exécution au moment où l'exception est levée, la ressource est trouvée.

Ai-je raté quelque chose? WPF n'est-il pas supposé essayer de rechercher la ressource dans les ressources de l'application?

MISE À JOUR L'application est assez grand, donc je ne peux pas poster tout le code réel mais voici la façon dont les ressources sont fusionnées et utilisées:

Brushes.xaml

<ResourceDictionary ...> 
    <SolidColorBrush x:Key="BrushName" Color="#12345678" /> 
</ResourceDictionary> 

SomeStyles.xaml

<ResourceDictionary ...> 
    <Style x:Key="SomeStyle"> 
    <Setter Property="SomeProperty" Value="{StaticResource BrushName}" /> 
    </Style> 
</ResourceDictionary> 

App.xaml

<Application ...> 
    <Application.Resources> 

    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="Brushes.xaml" /> 
     <ResourceDictionary Source="SomeStyles.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 


    </Application.Resources> 
</Application ...> 

Et puis un certain contrôle peut utiliser le style en utilisant la ressource comme ceci:

... 
Style={StaticResource SomeStyle} 
... 

MISE À JOUR

Il semble se passer aux menus et aux contrôles qui sont créés dans le code. Peut-il être lié à ces contrôles et menus ne faisant pas partie de l'arbre visuel d'une fenêtre?

+1

Pourriez-vous publier un code de la façon dont vous fusionnez le dictionnaire? –

+0

J'ai répliqué votre échantillon ici et il construit et fonctionne correctement pour moi, il semble que le problème est ailleurs dans votre code. –

+0

Une chance d'obtenir une réponse à ce sujet? –

Répondre

3

Votre dictionnaire SomeStyle.xaml doit référencer le dictionnaire Brushes.xaml directement, comme ceci:

<ResourceDictionary ...> 
    <ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Brushes.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
    <Style x:Key="SomeStyle"> 
    <Setter Property="SomeProperty" Value="{StaticResource BrushName}" /> 
    </Style> 
</ResourceDictionary> 

StaticResources ne recherche la arbre du dictionnaire actuel, vous devez donc passer dans toutes les ressources dont il a besoin pour référencer.

+0

Ceci est correct. –

0

Utilisez-vous DynamicResource dans l'extension de marquage XAML?

Votre XAML devrait être {} DynamicResource brushName pas {} StaticResource brushName

+0

DynamicResource atteint les performances, AFAIK – arconaut

+0

Oui, il atteint les performances, mais la raison pour laquelle il atteint les performances est qu'il a une portée de recherche supérieure. StaticResource ne fonctionne que si la ressource est dans la portée actuelle au moment de la compilation, DynamicResource effectuera la recherche de l'étendue à l'exécution. Le coup de performance sera induit mais au moins cela fonctionnera. –

+0

Eh bien, je comprends pourquoi il frappe la performance. Le problème est que les ressources de l'application sont censées être toujours dans la "portée actuelle" ... – arconaut