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.

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.


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>

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> 

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.