2017-10-30 3 views
0

So habe ich ein paar DataTemplate s in einer Benutzersteuerungsbibliothek. Diese DataTemplate s befinden sich im Ressourcenverzeichnis themes\generic.xaml und können problemlos im Bibliotheksprojekt verwendet werden.Zugreifen auf Ressourcen, die in der Steuerelemente-Bibliothek definiert sind

Dieses Bibliotheksprojekt wird vom Haupt-Desktopanwendungsprojekt verwendet. Zur Laufzeit kann Application.Current.FindResource() jedoch keine der in der Bibliothek definierten Ressourcen finden. (Ich dachte, es würde!)

So ging ich weiter und fusionierte diese Ressource Wörterbuch in Anwendungsressourcenverzeichnis:

<Application x:Class="Application"> 
    <Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="pack://application:,,,/ControlsLibraryProj;component/themes/generic.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
    </Application.Resources> 
</Application> 

und voila! es kann nun auf diese DataTemplate s zugreifen. Meine Frage ist, habe ich es richtig gemacht? Muss ich ein in einem referenzierten Projekt definiertes Wörterbuch zusammenführen? Irgendwie habe ich den Eindruck, dass Application.Current.FindResource() Zugriff auf alle Ressourcen hätte, die in allen geladenen Modulen (exe und dll) definiert sind. Ist das richtig und habe ich sie unnötigerweise zweimal durch Zusammenführen geladen?

+0

Ist die Benutzersteuerungsbibliothek eine dritte Baugruppe oder eine eigene Baugruppe? –

+0

@IlVic: Es ist meine eigene Bibliothek und als ein Projekt in der Lösung verfügbar. – dotNET

Antwort

1

Meine Frage ist, habe ich es richtig gemacht?

Ja.

Muss ich ein in einem referenzierten Projekt definiertes Wörterbuch zusammenführen?

Ja, wenn Sie tatsächlich die Stile in dem referenzierten Projekt in Ihrem App-Projekt definiert beabsichtigen, zu verwenden.

Die einzige Ausnahme sind die Standardsteuerelemente, d. H. Die Standardstile für alle Steuerelemente, die im referenzierten Projekt definiert sind. Dies sind diejenigen, die Sie normalerweise in themes/generic.xaml definieren. Diese werden auf alle Instanzen der entsprechenden Steuerelemente angewendet, die Sie in Ihrer Anwendung erstellen, ohne dass Sie themes/generic.xaml zusammenführen müssen.

+0

Danke. Das macht Sinn. – dotNET

1

Wenn Sie die Benutzer-Control-Bibliothek mit dem eigenen schreiben, würde ich eher empfehlen Sie generic.xaml mit Ressourcen nur für Ihre benutzerdefinierte Steuerelemente deklariert. Wenn Sie nicht wollen, oder Sie es nicht tun können, sollten Sie IMHO ComponentResourceKey verwenden.

Sie finden ein Beispiel here (werfen Sie einen Blick auf die "Definieren von Ressourcen auf der Theme-Ebene" Abschnitt).

So wird Ihre Ressource als deklariert werden:

<LinearGradientBrush 
     x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:Painter}, ResourceId=ButtonBrush}" 
     StartPoint="0,0" EndPoint="1,1"> 
    <GradientStop Color="Blue" Offset="0" /> 
    <GradientStop Color="White" Offset=".8" /> 
</LinearGradientBrush> 

Und Sie können es Aufmerksamkeit

ComponentResourceKey brushKey = new ComponentResourceKey(typeof(Painter), "MyEllipseBrush"); 
ellipseBrush = (Brush)Application.Current.TryFindResource(brushKey); 

Bitte zahlen abrufen, weil:

Implizite Stil Anwendung auf das tritt nicht auf Themenebene. Angenommen, möchten Sie, dass alle Beschriftungen auf Ihren Steuerelementen einen bestimmten Stil haben. Wenn Sie den Stil auf Elementebene definieren, müssen Sie dem Stil keinen expliziten Schlüssel geben. Die Beschriftungen verwenden automatisch den Stil . Dies ist bei Ressourcen auf der Themenebene nicht der Fall. Sie müssen einen Schlüssel definieren und den Stil an jeder Stelle referenzieren, an der Sie verwenden möchten.

Ich hoffe, das kann Ihnen helfen.

+0

Vielen Dank. Das ist sicherlich ein interessanter Weg, dies zu tun. – dotNET

+0

Sie sind herzlich willkommen @dotNET! –

Verwandte Themen