So kombinieren Sie importierte und lokale Ressourcen in der WPF-Benutzersteuerung

82

Ich schreibe mehrere WPF-Benutzersteuerelemente, die sowohl gemeinsam genutzte als auch individuelle Ressourcen benötigen.

Ich habe die Syntax zum Laden von Ressourcen aus einer separaten Ressourcendatei herausgefunden:

<UserControl.Resources>
    <ResourceDictionary Source="ViewResources.xaml" />
</UserControl.Resources>

Wenn ich dies tue, kann ich jedoch auch keine lokalen Ressourcen hinzufügen, wie z.

<UserControl.Resources>
    <ResourceDictionary Source="ViewResources.xaml" />
    <!-- Doesn't work: -->
    <ControlTemplate x:Key="validationTemplate">
        ...
    </ControlTemplate>
    <style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
        ...
    </style>
    ...
</UserControl.Resources>

Ich habe mir ResourceDictionary.MergedDictionaries angesehen, aber damit kann ich nur mehr als ein externes Wörterbuch zusammenführen und keine weiteren Ressourcen lokal definieren.

Mir muss etwas Triviales fehlen?

Es sollte erwähnt werden: Ich hoste meine Benutzersteuerelemente in einem WinForms-Projekt, daher ist das Einfügen freigegebener Ressourcen in App.xaml keine Option.

Tor Haugen
quelle

Antworten:

157

Ich habe es herausgefunden. Die Lösung beinhaltet MergedDictionaries, aber die Details müssen genau richtig sein, wie folgt:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- This works: -->
        <ControlTemplate x:Key="validationTemplate">
            ...
        </ControlTemplate>
        <style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
            ...
        </style>
        ...
    </ResourceDictionary>
</UserControl.Resources>

Das heißt, die lokalen Ressourcen müssen im ResourceDictionary-Tag verschachtelt sein . Das Beispiel hier ist also falsch.

Tor Haugen
quelle
5

Sie können lokale Ressourcen im Abschnitt MergedDictionaries definieren:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <!-- import resources from external files -->
            <ResourceDictionary Source="ViewResources.xaml" />

            <ResourceDictionary>
                <!-- put local resources here -->
                <Style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
                    ...
                </Style>
                ...
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>
Lu55
quelle
5

Verwenden Sie MergedDictionaries .

Ich habe das folgende Beispiel von hier.

Datei1

<ResourceDictionary 
  xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation "
  xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml " > 
  <Style TargetType="{x:Type TextBlock}" x:Key="TextStyle">
    <Setter Property="FontFamily" Value="Lucida Sans" />
    <Setter Property="FontSize" Value="22" />
    <Setter Property="Foreground" Value="#58290A" />
  </Style>
</ResourceDictionary>

Datei 2

   <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="TextStyle.xaml" />
        </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary> 
Preet Sangha
quelle
Danke, aber kein Glück. Sein Beispiel scheint richtig zu sein, funktioniert aber nicht wirklich. Ich erhalte die Meldung "Die Eigenschaft 'Ressourcen' wurde mehrmals festgelegt".
Tor Haugen
Ich kenne MergedDictionaries. Ich kann jedoch keine externe Wörterbuchreferenz mit lokal definierten Ressourcen so kombinieren, wie ich es möchte. Wie bereits erwähnt, gibt es auf der Seite, auf die Sie verweisen, ein Beispiel, das jedoch nicht funktioniert.
Tor Haugen
2
Für alle, die den Fehler "Mehr als einmal festlegen" erhalten: Alle anderen Ressourcen müssen sich im ersten <ResourceDictionary> -Tag befinden.
Hexo