Frage

Im Moment arbeite ich auf Wörterbücher von Styles und Templates mit, dass ich dynamisch auf meine Anwendung anwenden kann. Vor diesem „neuen wanted“ dynamischen Verhalten, hatte ich mehr Ressourcen Wörterbücher, ein für jede gestylten Kontrolle, dass ich in der App.xaml verschmolzen:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ColorsDictionary.xaml"/>
            <ResourceDictionary Source="ControlsTemplatesDictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Nun würde ich meine Bewerbung gerne gestylt werden, so dass ich alle meine bisherigen Ressourcen in eine neuen „MyFirstTemplates“ genannt zu fusionieren entschieden und nur dieses Wörterbuch zum App.xaml hinzuzufügen.

Neue Wörterbuch "MyFirstTemplates.xaml":

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">"
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="ColorsDictionary.xaml"/>
        <ResourceDictionary Source="ControlsTemplatesDictionary.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

New App.xaml:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="MyFirstTemplates.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <Style TargetType="{x:Type Window}"/>
    </ResourceDictionary>
</Application.Resources>

Hinweis: Der Standardstil für das Fenster ist ein Fehler von WPF 4 zu korrigieren, finden Sie unter ein fusioniertes Wörterbuch zu einem zusammen~~POS=TRUNC Wörterbuch

Nun, da ich diese Änderung vorgenommen habe, kann ich nicht eine Farbressource von „ColorsDictionary.xaml“ verwenden, wie ein Static in „ControlsTemplateDictionary.xaml“ mehr. Wenn ich zu verschmelzen diese Dateien im app.xaml, alles funktioniert wieder ändern. Damit es funktioniert, muss ich ändern sich entsprechend dem Static für Dynamic . Haben Sie eine Ahnung, warum dies nicht mehr funktioniert?

Danke: -)

War es hilfreich?

Lösung

Durch die Wörterbücher aus App.xaml bewegen sich die Ressourcen von jedem Wörterbuch sind nicht in der Ressourcenstruktur des anderen während des Ladens von MyFirstTemplates.xaml. Ihre ursprüngliche Setup geladen erster ColorsDictionary, die dann durch App-Ressourcen ControlsTemplatesDictionary verfügbar war, während es geladen. In Ihrem neuen Setup, um für die Farb Ressource in App-Ressourcen zur Verfügung, um es durch MyFirstTemplates geladen werden muss, was wiederum Belastung beiden Wörterbücher erfordert, was wiederum den Zugriff auf die Farb Ressource erfordert ... so ist es irgendwie eine Endlosschleife von Referenzen, die statisch nicht gelöst werden können. Dynamic kann warten, bis alles geladen ist und dann Zugriff auf die Farbe, ohne Frage.

Verwenden Sie entweder beheben Dynamische oder fusionieren ColorsDictionary direkt in ControlsTemplatesDictionary.

Andere Tipps

Große Antwort von John erklärt, warum dies geschieht. Das Problem ist also, dass, wenn innerhalb eines fusionierten Wörterbuch fusionierten Wörterbücher verwenden, der innere Wörterbücher kann nicht „Verwendung“ sich als Static.

Grund Lösungen:

  • Mit Dynamic
  • Verwenden Sie nur eine einzige Ebene der Hierarchie von App.xaml bei der Verwendung von Static

Beide Lösungen haben Probleme. Dynamic hat ein Leistungsproblem. Die zweite Lösung Grenzen Sie, wie Sie Ihre XAML-Ressourcen organisieren.

Alternative Lösung:

habe ich ein kleines einfaches Programm (sofern unten in GitHub), die als Pre-Build-Ereignis ausgeführt wird und XAML-Dateien aus einem Ordner in eine langen XAML-Datei zusammenführen. Nun, müssen sie mit einer anderen Erweiterung (.txaml) sein, sonst werden sie kompiliert werden.

So können Struktur Ressourcen Ordner und Dateien, wie Sie wollen, ohne Einschränkungen WPF. Static und der Designer wird immer funktionieren.

Der Code in GitHub eine einfache Lösung enthält, die das Verschmelzen Programm enthält. Es verschmilzt zwei Ordner in zwei Dateien. Ein für App.xaml Ressourcen und die andere für generic.xaml Ressourcen. Die XAML-Dateien in einem "Controls" Projekt (Es gibt auch "Main" Projekt).

Blog post Erklärung dieses

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top