44 votes

Problème de référencement d'un dictionnaire de ressources contenant un dictionnaire fusionné

J'ai une bibliothèque, CommonLibraryWpfThemes, avec plusieurs Dictionnaire de Ressources XAML fichiers qu'il contient. Mon Themes/Generic.xml le fichier contient un ResourceDictionary.MergedDictionaries déclaration qui fusionne tous les autres fichiers.

Génériques.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary
            Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/BrushDictionary.xaml" />
        <ResourceDictionary
            Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/TextBlockDictionary.xaml" />
        <ResourceDictionary
            Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/LabelDictionary.xaml" />
        <ResourceDictionary
            Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/ButtonDictionary.xaml" />
        <ResourceDictionary
            Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/WindowDictionary.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Dans mon projet, j'ai une référence à CommonLibraryWpfThemes, et j'ai explicitement référence Generic.xml dans mon Application.fichier xaml.

App.xaml -- ÉCHOUE

<Application
    x:Class="MyApp.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary
            Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" />
    </Application.Resources>
</Application>

Cela ne fonctionne pas. J'obtiens l'erreur suivante quand je lance mon application:

System.Windows.Markup.XamlParseException occurred
  Message="Cannot find resource named '{_fadedOrangeBrush}'. Resource names are case sensitive.  Error at object 'System.Windows.Setter' in markup file 'CommonLibraryWpfThemes;component/ResourceDictionaries/WindowDictionary.xaml' Line 18 Position 13."
  Source="PresentationFramework"
  LineNumber=18
  LinePosition=13

Si je place le contenu de Génériques.xaml dans l'App.xaml directement, tout fonctionne bien:

App.xaml -- RÉUSSIT

<Application
    x:Class="MyApp.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary
                    Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/BrushDictionary.xaml" />
                <ResourceDictionary
                    Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/TextBlockDictionary.xaml" />
                <ResourceDictionary
                    Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/LabelDictionary.xaml" />
                <ResourceDictionary
                    Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/ButtonDictionary.xaml" />
                <ResourceDictionary
                    Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/WindowDictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>


Peut-être que je vais à ce sujet dans le mauvais sens. Mon objectif est de le rendre facile pour faire référence à toutes mes ressources de thème à partir de plusieurs applications sans avoir à dresser la liste de tous les fichiers individuels. Est-il recommandé de faire cela? (Note: je ne suis pas en train de basculer entre plusieurs thèmes--je viens d'avoir un thème.)

Comme un bonus, ça serait sympa si quelqu'un pouvait me dire comment faire référence à des ressources dans une bibliothèque externe sans casser le designer de Visual Studio.

Merci.

EDIT:

J'ai essayé d'emballage ResourceDictionary dans un ResourceDictionary.MergedDictionary élément, mais qui n'a pas fonctionné (je reçois le même message d'erreur):

<Application
    x:Class="MyApp.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary
                    Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

67voto

Fredrik Hedblad Points 42772

Répondu à une question similaire ici plus tôt, voir Ajout d'une fusion de Dictionnaire, à une fusion de Dictionnaire en question.

C'est une optimisation de bug, voir Microsoft se Connecter / DefaultStyleKey style n'est pas trouvé dans l'intérieur MergedDictionaries:

Sur la création de chaque objet dans XAML, si un style par défaut est présent (c'est à dire de style w/ clé de Type) qui le style doit être appliqué. Comme vous pouvez le imagine qu'il y a plusieurs performances des optimisations à faire que (implicite) recherche un peu de poids que possible. Un c'est que nous ne regardons pas à l'intérieur Les Dictionnaires de ressources, sauf s'ils sont marqué comme "contenant par défaut Les Styles". Il y a un bug: si tous vos les styles par défaut sont imbriqués dans fusionné dictionnaires trois niveaux de profondeur (ou plus profond), le haut du dictionnaire n' sont marqués de sorte que la recherche, l'ignore. Le contourner est de mettre une valeur par défaut Le Style à quelque chose, quoi que ce soit, dans le racine Dictionnaire.

L'ajout d'un mannequin un style à la racine du dictionnaire corrige ce. Exemple

<Application x:Class="MyApp.App"  
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">  
    <Application.Resources> 
        <ResourceDictionary> 
            <ResourceDictionary.MergedDictionaries> 
                <ResourceDictionary 
                    Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" /> 
                </ResourceDictionary.MergedDictionaries> 
            <!-- Dummy Style, anything you won't use goes --> 
            <Style TargetType="{x:Type Rectangle}" /> 
        </ResourceDictionary> 
    </Application.Resources> 
</Application>   

12voto

Chris Points 536

Vérifiez votre constructeur dans App.xaml.cs appelle InitializeComponent () - c’est ce qui fusionne les dictionnaires de ressources ...

4voto

Kenan E. K. Points 8497

Vous ne devriez pas avoir de référence generic.xaml à tous, il a un support intégré. Toutefois, cela signifie qu'il fournit par défaut de style, ce qui n'est pas explicitement définie. Définir explicitement les styles et les modèles doivent être réalisables à partir explicitement référencé res dictionnaires.

(EDIT pour plus de clarté)

La seule exception est l' App.xaml, où défini les ressources sont accessibles par l'ensemble de l'application, sans nécessiter pour faire référence à une ressource spécifique dictionnaire. La ressource elle-même, devra être accessible par son nom.

La raison de cet échec

<Application.Resources>
    <ResourceDictionary
        Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" />
</Application.Resources>

c'est, je crois, parce que vous n'avez pas de l'envelopper dans un MergedDictionary wrapper, ajoutant qu'il a fusionné les dictionnaires. De l'ajouter directement à des ressources ne fonctionne que pour les ressources que vous déclarer localement, par exemple, les styles, etc. eux-mêmes.

Cependant, comme je l'ai dit avant, vous ne devriez pas avoir à fusionner generic.xaml n'importe où, peut-être vous devriez juste refactoriser les pinceaux et les autres ressources utilisées à l'extérieur de styles et de fusionner ces ressources en app.xaml.

Notez également que les styles n'ont pas à être dans le générique.xaml pour avoir "style par défaut" comportement - si un style avec clé, qui est égale au type de l'élément est accessible à elle (dans le monde, ou dans les ressources locales), alors il utilisera le style comme style par défaut. L' generic.xaml est juste une commodité.

Vérifier cette réponse.

Pour les autres formes personnalisées, etc, vous avez besoin de faire référence à ces ressources de manière explicite.

Vous devriez également vérifier le contenu de l' WindowDictionary.xaml, cette erreur a une odeur particulière à ce sujet.

0voto

ouflak Points 1206

J'avais eu cette erreur lors de mes tests unitaires et la réponse de Chris ci-dessus m'a donné la clé dont j'avais besoin. Fondamentalement sur ma première méthode testée, je mets:

         MyApplication.App app = new MyApplication.App();
        app.InitializeComponent();
 

Et tout à coup, il pourrait trouver mon modèle pour mes pages. Remarque: cela signifie que vous devez vérifier si une instance de votre application existe déjà si vous testez également votre App.cs.

-1voto

drweb86 Points 1340

Ma solution est ici , cliquez sur Solutions de contournement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X