2015-12-08 6 views
7

TLDR;Entwurfszeit Fehler beim Suchen des Ressourcenverzeichnisses - Inkonsistent zwischen Projekten

Bildschirme, die während der Laufzeit neu auf eine externe Datei ResourceDictionary im VS2015-Stil verweisen, aber nicht zur Entwurfszeit. Was gibt?


Bei der Arbeit haben wir ein Produkt, das WinForms viele WinForms-Bildschirme mit einem Entwickler beherbergt aktiv neue hinzufügen, sowie eine Handvoll von WPF-Bildschirmen mit mir neue hinzufügen. Ich habe viel Wiederholungscode/Styling in bestehenden WPF-Bildschirmen gesehen und ein einziges Projekt erstellt, um dies zu berücksichtigen - um von allen vorhandenen/zukünftigen WPF-Bildschirmen referenziert zu werden.

Projekt: WpfHelper

  • Plattform Ziel: Jede CPU
  • Target Framework: .NET Framework 4.6
  • WpfHelper.dll eingesetzt ...\Trunk\Project\Externals
  • ...\Trunk\Utilities\WpfHelper\WpfHelper\Resources\GlobalResources.xaml
    • Build Action: Seite
    • Resource enthält generische Arten

I ...\Trunk\Project\Externals\WpfHelper.dll in sechs Projekten verwiesen haben, Hinzufügen des folgenden Codes zu jedem ihrer Ressourcendateien:

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="pack://application:,,,/WpfHelper;Component/Resources/GlobalResources.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

Alle Bildschirme sind in ...\Trunk\Project\Plugins gelegen .

╔══════════╦═════════════════╦═════════════════╦══════════════════╦════════════════════════════════════════════════╗ 
║   ║ Resource Works? ║ Platform Target ║ Target Framework ║ Reference File Path       ║ 
╠══════════╬═════════════════╬═════════════════╬══════════════════╬════════════════════════════════════════════════╣ 
║ Project1 ║ Succeeded  ║ Any CPU   ║ .NET 4.6   ║ ...\Project1\Project1\Resources\Resources.xaml ║ 
║ Project2 ║ Succeeded  ║ x86    ║ .NET 4.6   ║ ...\Project2\Project2\Resources\Resources.xaml ║ 
║ Project3 ║ Succeeded  ║ Any CPU   ║ .NET 4.6   ║ ...\Project3\Project3\Resources\Resources.xaml ║ 
║ Project4 ║ Failed   ║ x86    ║ .NET 4.6   ║ ...\Project4\Project4\Resources\Resources.xaml ║ 
║ Project5 ║ Failed   ║ x86    ║ .NET 4.6   ║ ...\Project5\Project5\Resources\Resources.xaml ║ 
║ Project6 ║ Failed   ║ Any CPU   ║ .NET 4.6   ║ ...\Project6\Project6\Resources\Resources.xaml ║ 
╚══════════╩═════════════════╩═════════════════╩══════════════════╩════════════════════════════════════════════════╝ 

Letzte Änderungen

Erst kürzlich verbessern ich von Visual Studios 2013 bis 2015. Etwa zur gleichen Zeit, die anderen Bildschirm-Entwickler all vorhandenen Bildschirm Projektziel Frameworks .NET Framework 4.6 von .NET Framework aufgerüstet 3.5/4.0.

Erfolgreiche Projekte

  • verwiesen I WpfHelper.dll vor den Letzten Änderungen.
  • Styles korrekt angewendet zu Design-Zeit und Laufzeit.

gescheiterte Projekte

  • I verwiesen WpfHelper.dll nach der letzten Änderung.
  • Stile wurden nur zur Laufzeit korrekt angewendet.
  • Während Entwurfszeit wird der Fehler ausgelöst:

    ist ein Fehler aufgetreten, während die Ressource Wörterbuch zu finden, "pack: // Anwendung ,,,/WpfHelper; Komponente/Ressourcen/GlobalResources.xaml".

    Wert sein kann nicht null

    :

  • Wo die lokalen Resources.xaml verwendet werden, wird die nachfolgenden Fehler ausgelöst. Parametername: Artikel

Was ich versucht habe:

Nach einer umfangreichen Liste von Artikeln und Q & A liest:

Ich habe versucht, alle folgenden ohne Erfolg:

  • Projekt ändern Platform Ziel "Any CPU"
  • Projekt ändern Zielrahmen von/zu .NET Framework 4.6
  • Stellen Sie sicher, dass alle Resource.xaml-Dateien dieselbe Erstellungsaktion (Seite) usw. hatten.
  • Überprüft die Datei AssemblyInfo.cs jedes Projekts. Failing Projekte enthalten (und ich entfernt) folgendes:

    [assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)] 
    
  • manuell den temporären Ordner in AppsData, Gereinigt & Rebuilt Projekte gelöscht.

  • Projekte erneut geöffnet.
  • Neu gestartet.
  • Klicken Sie mit der rechten Maustaste auf kopierte WpfHelper.dll Referenzen von Arbeitsprojekten und fügen Sie sie in Referenzen fehlender Projekte ein.
  • Die WpfHelper.Resources.GlobalResources.xaml wurde als eine verknüpfte Datei zu den fehlgeschlagenen Projekten hinzugefügt.
  • Nagge jeder Mitarbeiter.
  • Die vollständige URI für Unterwörterbücher hinzugefügt, die in GlobalResources.xaml verwendet werden.
  • Killed the designer und das Projekt neu erstellt.

Ich bin aus Ideen und verloren in der Forschung. Ich habe templated eine der Arbeitslösungen und verwendet, dass für die Erstellung neuer Bildschirme - das schafft neue Bildschirme, die zur Entwurfszeit erfolgreich angezeigt werden. Es ist etwas über diese bereits bestehenden Bildschirme. Wie kann ich mit den fehlgeschlagenen Projekten gestylte Ressourcen zur Entwurfszeit korrekt anzeigen?

+0

Sie könnten dieses Problem lösen? – Olga

+0

@ Olga Leider wurde dies nie gelöst. Es hat das Ändern der GUI der Bildschirmschirme viel zeitaufwändiger gemacht. – OhBeWise

+0

Ich wünschte, ich könnte helfen. Dies ist ein konsistentes Problem für ein Projekt von beliebiger Komplexität. – dex3703

Antwort

1

Ich habe eine Lösung für dieses Problem erarbeitet, die wenig Aufwand erfordert.

zunächst einen Code hinter Datei für die Ressource Wörterbuch hinzuzufügen, GlobalResources.xaml.cs:

namespace YourNamespaceHere 
{ 
    partial class GlobalResources : ResourceDictionary 
    { 
     public GlobalResources() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

setzen Sie dann die x: Class-Eigenschaft auf den Resource Tag in GlobalResources.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        x:Class="YourNamespaceHere.GlobalResources"> 

Sie sind nun in der Lage eine Instanz des Ressourcenverzeichnis wie diese zu erstellen:

new YourNamespaceHere.GlobalResources() 

In der WPF Benutzersteuerung, wo Sie die Ressourcenverzeichnis verwenden, fügen Sie den folgenden an den Konstruktor i UserControl1.xaml.cs:

public UserControl1() 
{ 
    if (DesignerProperties.GetIsInDesignMode(this)) 
     this.Resources.MergedDictionaries.Add(new YourNamespaceHere.GlobalResources()); 

    InitializeComponent(); 
} 

Nun ist die WinForms-Designer für die Steuerung, wo UserControl1 verwendet wird, wird nicht mehr beschweren über das Finden deiner DLL, die das Betriebsmittelwörterbuch enthält. Verwendete Ressourcen werden auch im Designer angezeigt.

Um die WPF-Designer Inhalte aus dem Ressourcenverzeichnis zeigen, wird sicherstellen, dass in UserControl1 verwendet wird, können Sie die folgenden in Ihrem UserControl1.xaml noch brauchen:

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/MyDll;component/GlobalResources.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

MyDll ist der Name der Anordnung der umschließende Ressourcenwörterbuch. In diesem Beispiel wird erwartet, dass GlobalResources.xaml und GlobalResources.xaml.cs auf der Stammebene der Assembly (nicht in einem Ordner) platziert werden.

+0

Ich kann derzeit nicht überprüfen, ob diese Lösung funktioniert. Ich habe Jobs verschoben, und meine Versuche, das Problem zu reproduzieren, sind fehlgeschlagen. Ich werde es weiter versuchen, wenn ich eine Chance habe. Vielleicht können andere Benutzer helfen, @ dex3703? – OhBeWise

Verwandte Themen