2012-11-01 15 views
7

Ich halte meine App-Ressourcen in einem separaten DLL und verweise sie in meinem Haupt-EXE so etwas wie dies in App.xaml mit: -WPF fusionierte Ressourcenwörterbücher in jeder Benutzersteuerung - schlechte Idee?

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="pack://application:,,,/MyThemesAssembly;component/Themes/Generic.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

Wenn ich ein Fenster bearbeiten, die in der Haupt EXE-Projekt ist, die VS2010-Designer erkennt keine Ressourcen von der anderen Assembly, daher wird kein Styling angewendet (nicht wirklich ein Problem, da ich immer in der XAML-Ansicht arbeite). Allerdings erkennt Resharper diese externen Ressourcennamen auch nicht, was bei der Bearbeitung von XAML zu vielen Squiggles unter den Ressourcennamen führt.

Ich habe festgestellt, dass ich sowohl den VS-Designer und Resharper durch Einbeziehung der oben genannten XAML in jedem Fenster und Benutzerkontrolle beheben kann, aber wird dies negative Auswirkungen auf Speicher und/oder Leistung haben? Erhält jedes Fenster eine separate Kopie der Ressourcen?

+0

Nun, die Fehler in der IDE und in den Tools sollten Ihren Code nicht beeinflussen. Außerdem ist das Ressourcenwörterbuch in jedem einzelnen Steuerelement ein fehleranfälliger Weg (was ist, wenn Sie das Wörterbuch umbenennen möchten, um ein weiteres hinzuzufügen?). – Vlad

+0

Ich würde jedoch versuchen, eine Eigenart hinzuzufügen, die das Problem im Entwurfsmodus umgeht. (Vielleicht hilft dies: 'öffentliche Klasse MyUserControlBase: UserControl {öffentliche MyUserControlBase() {if (DesignerProperties.GetIsInDesignMode (this)) LoadExternalDictionariesExplicitelyHere(); ...') – Vlad

+1

@Vlad Ich habe gelernt, mit den Squiggles leben - das Ansatz der Reparatur Resharper ist wirklich nur ein "nice to have". Ich denke nicht, dass das Umbenennen/Hinzufügen von Ressourcen ein Problem darstellt - in meinem obigen Beispiel von XAML führt "Generic.xaml" selbst eine Ladung anderer Ressourcen in dieser Assembly zusammen, so dass es einfach ist, neue hinzuzufügen. Es macht mir mehr Sorgen, ob die in jedem Fenster die Speicherleistung der App (oder VS2010) beeinträchtigen. –

Antwort

2

Verwenden Sie VS2012.

Ich habe ein Testprojekt, das ich wurde mit dem ich von einem externen Montageressourcenverzeichnis tut Verschmelzung und in meinem app.xaml Ich habe diese:

<Application x:Class="WpfPackDictionaries.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="pack://application:,,,/WPFCommonLibrary;component/Vectors/Vectors.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

Da ist in meinem MainWindow.xaml Ich habe diese wo der Weg in einem Stil ModifiablePathStyle zieht:

<Window xmlns:Control="clr-namespace:WPF.Common.Control;assembly=WPFCommonLibrary" x:Class="WpfPackDictionaries.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Grid> 
     <Path Style="{StaticResource ModifiablePathStyle}" Fill="Red"/> 
     <Control:Jabberwocky /> 
    </Grid> 
</Window> 

Intellisense/ReSharper (V7.1 10/31 (Early Access erstellen)) erkennt den Stil und ich habe keine squigglies:

enter image description here

Haben Sie also versucht, in VS2012 zu arbeiten?

+0

Wir werden irgendwann auf VS2012 umziehen, aber immer noch auf das $$$ vom Management warten! –

+0

@AndrewStephens All die beste Arbeit wird in Achtung des Managements getan. ;-) – OmegaMan

+0

@AndrewStephens Verwenden Sie die VS2012 Express Edition für Ihre XAML-Arbeit. Es kann weiterhin .NET 3.5/4.0-Projekte kompilieren, ohne die .prj oder .sln-Projekte zu ändern. – OmegaMan

3

Wir hatten ein Problem in unserer Anwendung mit der Verwendung von Resource Dictionaries in jedem UserControl/View verwiesen. Ich rate davon ab. Es ist uns gelungen, den Speicherbedarf unserer Anwendung durch Verwendung von SharedResourceDictionaries um 300 MB zu reduzieren. Es sieht so aus, als ob Sie das ResourceDictionary für jedes einzelne UserControl in Ihrer Anwendung instanziiert haben. Tun Sie das nicht nur, um den VS-Designer zu reparieren.

2

VS2012 kann Ressourcen "sehen", da VS XAML-Designer den Code in Entwurfszeit lädt und ausführt, sodass VS überprüfen kann, welche Ressourcen zur Laufzeit verfügbar sind. ReSharper verwendet niemals Design-Time Code-Ausführung (da dies erfordert, dass Ihr Code immer im kompilierbaren Zustand ist), so dass die XAML-Unterstützung eine etwas komplexere Aufgabe wurde.

ReSharper 8.0 implementiert Unterstützung für BAML-Dekompilierung und extrahiert die Liste der XAML-Dateien und löst XAML-Ressourcen von referenzierten binären Assemblys auf.

Verwandte Themen