Frage

Ich habe eine Baseskin und mehrere Benutzerkins in einer separaten DLL von meiner WPF -Anwendung.

Abhängig davon, wer die Anwendung verwendet, wird die Grundhaut und eine der Benutzerhäute in ein Ressourcenwörterbuch zusammengefasst und für die Verwendung der Anwendung geladen.

Was ich anstrebe, ist die Fähigkeit, einen Stil in einer Basenkinentatei anzugeben und dann in einer bestimmten Benutzerdatei in der Lage zu sein, ihn zu überschreiben und alle Eigenschaften zu ändern, die ich benötigt.

Ich weiß, dass ich dies erreichen kann, indem ich das basierteon -Attribut wie dieses verwendete:

Base:

<Style x:Key="ButtonBg" TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Green"/>
</Style>

Benutzer:

<Style x:Key="CustomButtonBg" TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonBg}">
    <Setter Property="Background" Value="Blue"/>
</Style>

Das Problem ist, dass die Elemente jetzt einen CustombuttonBG -Stil haben müssen, der möglicherweise nicht tatsächlich implementiert wird. Gibt es eine Möglichkeit, beide Stile den gleichen Schlüssel (ButtonBG) zu verwenden, und wenn sie zusammengeführt werden, suchen Sie zuerst nach einem Stil mit dem Namen ButtonBG. Wenn Sie nicht vorhanden sind, verwenden Sie die in der Basis?

Ich dachte, wenn ich den Namen der Montage im basierten Attribut angeben könnte, um auf die Basenkinentatei hinzuweisen, könnte ich es vermeiden, Fehler zu benennen, wenn ich ihnen den gleichen Schlüssel gebe, aber ich kann dies nicht finden. Die anderen Möglichkeiten sind nur eine Implementierung jedes Stils, auch wenn sich nichts geändert hat, oder programmatisch in den Skins prüfen, aber dies sind die letzten Mittel.

War es hilfreich?

Lösung

Sie könnten versuchen, die Ressourcen -Lookup -Logik zu nutzen. Wenn WPF versucht, eine Ressource nach dem Schlüssel zu finden, sieht es zunächst im aktuellen Element aus ResourceDictionary, Dann ist die Eltern, dann der Elternteil davon und so weiter.

Da Sie also gesagt haben, dass es dem Benutzer abhängig ist, könnte dies in der zusammengeführt werden ResourceDictionary Bei der Window Level, während Ihre ursprüngliche Basis am Application eben.

Bearbeiten: Ich habe bessere Informationen. Aus MSDN über zusammengeführte Wörterbücher:

Fusioniertes Wörterbuchverhalten

Ressourcen in einem zusammengeführten Wörterbuch belegen einen Standort im Ressourcen -Suchumfang, der kurz nach dem Umfang des Hauptressourcenwörterbuchs erfolgt, mit dem sie zusammengeführt werden. Obwohl ein Ressourcenschlüssel innerhalb eines einzelnen Wörterbuchs eindeutig sein muss, kann ein Schlüssel in einer Reihe fusionierter Wörterbücher mehrmals existieren. In diesem Fall stammt die zurückgegebene Ressource aus dem letzten Wörterbuch, das nacheinander in der Sammlung von FergedDictionaries gefunden wird. Wenn die Sammlung von FergedDictionaries in XAML definiert wurde, ist die Reihenfolge der zusammengeführten Wörterbücher in der Sammlung die Reihenfolge der Elemente, die im Markup angegeben sind. Wenn ein Schlüssel im primären Wörterbuch und auch in einem zusammengeführten Wörterbuch definiert ist, stammt die zurückgegebene Ressource aus dem Primärwörterbuch. Diese Scoping -Regeln gelten sowohl für statische Ressourcenreferenzen als auch für dynamische Ressourcenreferenzen.

Das heißt, Sie können Ihre Grundhaut in einem anderen definieren ResourceDictionary und verschmelzen es in einen anderen ResourceDictionary. Lassen Sie den Benutzer die Haut in letzterem haben und er wird ihn zuerst finden, sonst bohrt er weiter auf das zusammengeführte Wörterbuch, das Basis enthält. Jeder Ihrer Benutzerwörterbücher kann das Basiswörterbuch zusammenführen und Sie laden einfach das Benutzerwörterbuch in die App anstelle von beiden.

Andere Tipps

Sie können Ihre Basis einfach als BasebuttonBG benennen und wenn Sie ein benutzerbasiertes Ressourcenwesen nicht zusammenführen, fusionieren Sie eine generische, die enthält:

<Style x:Key="ButtonBg" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonBg}"/>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top