Überschreiben von Ressourcen in XAML
Habe ich folgende UserControl
:
<UserControl x:Class="MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<SolidColorBrush x:Key="ColorKey" Color="Orange"/>
</UserControl.Resources>
<Grid Background="{StaticResource ColorKey}">
</Grid>
</UserControl>
und ich benutze es so:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:OverrideResource"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<SolidColorBrush x:Key="OtherColorKey" Color="Blue"/>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<local:MyControl Grid.Row="0">
<local:MyControl.Resources>
<SolidColorBrush x:Key="ColorKey" Color="Red"/>
</local:MyControl.Resources>
</local:MyControl>
<Grid Grid.Row="1">
<Grid.Resources>
<SolidColorBrush x:Key="OtherColorKey" Color="Green"/>
</Grid.Resources>
<Grid Background="{StaticResource OtherColorKey}"/>
</Grid>
</Grid>
</Window>
Überschreiben von Ressourcen OtherColorKey
funktioniert wie ich erwartet; das Gitter ist grün Background
. Aber ich möchte zum überschreiben eines Resource
verwendet wird, innerhalb der UserControl
(ColorKey
in meinem Beispiel). Aber ich bin immer Ausnahme:
Element wurde bereits Hinzugefügt. Schlüssel im Wörterbuch: 'ColorKey' - Taste Hinzugefügt wird: 'ColorKey'
Dies ist nur ein Vereinfachtes Beispiel, in der Realität brauche ich es für ein bisschen mehr komplexe Aufgabe. Ich weiß, dass unter anderem DevExpress verwendet ähnlichen Mechanismus für die Anpassung Ihrer Kontrollen (diese sind allerdings nicht verwenden strings als Schlüssel, sondern von Objekten, die von ResourceKey
). Aber ich bin nicht in der Lage zu finden, einfachen Beispiel arbeiten zu implementieren, die so etwas auf meiner eigenen.
Vielen Dank für Ihre Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach der Lektüre Ihrer post, und die Antwort auf die erste Antwort, es scheint, Sie schreiben eine Anwendung, die Sie benötigen, um zu verfolgen mehrere styling-Elemente. Die beste Weise, Sie zu halten organisiert und leicht zu warten ist die Benutzung eines ResourceDictionary-und darauf verweisen.
Für mich, ich habe eine viel einfachere Zeit, wenn ich separate mine basieren auf, was Sie sind zu definieren, eine für die Pinsel und Farben und eine für die ControlTemplates und-Stile (falls das Projekt ist extrem kompliziert, dann hängt es von verschiedenen anderen Faktoren - dies ist nur für relativ einfache Projekt).
Einmal diese ResourceDictionary-Dateien definiert worden, würde der Verweis in der App.xaml-Datei, damit Sie angewendet werden können, die in der gesamten Anwendung die zimmerreserviereung, ohne das immer neu definieren, eine Bürste oder eine Vorlage in die eigentliche XAML-Code der Seite.
So, ein Beispiel, wie die App.xaml-Code Aussehen kann:
Wie gesagt, dies ist ein sehr Vereinfachtes Beispiel, also die Quellcode-Dateien befinden sich im gleichen Projekt die App.xaml ist - einfach in den Ordner Ressourcen. Die BrushesAndColors.xaml referenziert, bevor die StylesAndTemplates.xaml, da die styles und templates definiert, hängt von den Farben, die Sie definiert haben.
Für die ResourceDictionary BrushesAndColors.xaml:
Den Bürsten sind die gleichen, wie Sie definiert ist, jedoch können Sie jetzt einfach referenziert werden, indem Sie Ihre Schlüssel in der gesamten Anwendung.
Für die StylesAndTemplates.xaml:
Aus Gewohnheit, habe ich immer noch Bezug auf das ResourceDictionary, die dieser braucht, um sicherzustellen, dass die styles und templates definiert werden können, finden Sie die Ressourcen, die ich als Referenz, wenn Sie zu erstellen.
Den zweiten Stil, dass ich ihn aus der ersten, damit ich nicht haben, zu schreiben, die ganze Sache - aber ich kann einfach ändern Sie die Farbe der hintergrund. So wird es Aussehen, wie die erste, außer mit einer anderen Hintergrundfarbe.
Für das Hauptfenster - die etwas ändern wird:
Sie nicht mehr haben, neu zu definieren, alle Informationen über die Benutzeroberfläche der Anwendung, halten Sie die XAML-sauberer und leichter zu Lesen.
Kann es nicht sein, die "easy fix" - aber es wird auf jeden Fall machen die Dinge viel einfacher als Sie fortfahren. Es wird auch helfen, jemand anderes, wenn mehr als eine person an dem Projekt arbeitet. Mit allem, was definiert, in einem zentralen Bereich, können Sie Stile und Farben konsistent und niemand ist mit zu durchforsten, die verschiedenen Seiten zu finden, welcher Stil wurde verwendet, sind Sie nur Verweis auf die entsprechenden.
Dies ermöglicht auch für Ihre Kontrolle nur einmal zu schreiben, sondern indem Sie verschiedene styles/templates sind Sie in der Lage zu ändern, wie die Informationen angezeigt werden, zu helfen, zu halten die Daten und die Anzeige von Informationen getrennt 🙂
Hoffe, das hilft, sorry für den langen post, aber es war die einzige Möglichkeit die ich mir vorstellen könnte, zu erklären, wie ich denke, Sie könnten am besten lösen Ihr problem (und halten es gelöst).
OtherColorKey Hinzugefügt wird, 2 verschiedene Wörterbücher (Fenster und Gitter). ColorKey ist, die Hinzugefügt wird, um das gleiche Wörterbuch (MyControl).
Einen besseren Weg, dies zu nähern, würde zu erklären, ein DependencyProperty vom Typ Bürste in MyControl, und legen Sie es wie:
Innerhalb von MyControl, nur binden, was Sie wollen, dass MyBrush Eigenschaft.