2010-04-19 8 views
16

Die Anwendung läuft gut, aber ich konnte mein Design in der Designer-Ansicht nicht sehen.Fehler MVVM Light + Blend-Designer: Ressource mit dem Namen "Locator" kann nicht gefunden werden.

Es besagt, dass Ressource mit dem Namen "Locator" nicht gefunden werden kann. Offensichtlich änderte ich nichts im Code, ich tat gerade die Datenbindung unter Verwendung des Datenverbindungsdialogs ...

jedermann mit dem gleichen Problem konfrontiert?

+0

sehr überrascht, diese Frage hat keine Favoriten oder upvotes überhaupt !! –

+1

Als jemand, der meistens in Mischung arbeitet, macht mich das jemanden erstechen wollen ... – BentOnCoding

+1

Ich hatte dieses Problem in Visual Studio 2011 und löste es, indem ich das Problem '{StaticResource Foo}' in '{DynamicResource Foo}' änderte. Hoffe, das hilft jemandem. – Tower

Antwort

8

Es gibt zwei bekannte Vorkommnisse, wo dies passieren kann.

  • Wenn Sie zu Blend wechseln, bevor Sie die Anwendung erstellt haben, sind die DLLs noch nicht verfügbar und dieser Fehler kann gesehen werden. Das Erstellen der Anwendung löst das Problem.

  • Es gibt einen Fehler in Expression Blend. Wenn Sie ein Benutzersteuerelement in ein anderes Benutzersteuerelement (oder Fenster in WPF) platzieren und das innere Benutzersteuerelement eine globale Ressource verwendet, kann die globale Ressource nicht gefunden werden. In diesem Fall erhalten Sie auch den Fehler.

  • Leider habe ich keinen Workaround für den zweiten Punkt, da es sich um einen Blend-Bug handelt. Ich hoffe, dass wir bald eine Lösung für das sehen werden, aber es scheint, in Mischung noch da zu sein 4.

    Was können Sie tun, ist

    • den Fehler ignorieren, wenn sie auf der äußeren Benutzersteuerung arbeiten. Wenn Sie mit dem inneren Benutzersteuerelement arbeiten, sollten die Entwurfszeitdaten in Ordnung sein (nicht sehr zufriedenstellend, die ich kenne).

    • Verwenden Sie den d: DataContext, um den Datenkontext für die Entwurfszeit in Blend vorübergehend festzulegen.

    Hoffentlich hilft,

    Laurent

    +0

    Was denkst du über meine Lösung unten?Ich mag es nicht, aber es funktioniert irgendwie –

    +0

    Das ist ein interessanter Ansatz. Ich weiß, was du meinst, wenn du es nicht liebst. OTOH, wenn der Code sauber isoliert ist (Design-Timecode), und es dein Leben im Tool einfacher macht ... nun, warum nicht. Danke auf jeden Fall. – LBugnion

    +0

    Ich erlebe das letzte Problem, und keine der Korrekturen scheint hier zu helfen !! Wie kann Microsoft dies in VS2010 und nicht in Blend 4 funktionieren? – jimplode

    7

    Ich habe mit einer einigermaßen akzeptable Lösung für dieses Problem kommen, da es nicht in Mischung 4 behoben wurde scheint zu:

    Fügen Sie im Konstruktor für Ihr XAML-Benutzersteuerelement einfach die erforderlichen Ressourcen hinzu, vorausgesetzt, Sie befinden sich im Entwurfsmodus in Blend. Dies kann nur der Locator oder auch Styles und Konverter sein.

    public partial class OrdersControl : UserControl 
    { 
        public OrdersControl() 
        { 
         // MUST do this BEFORE InitializeComponent() 
         if (DesignerProperties.GetIsInDesignMode(this)) 
         { 
          if (AppDomain.CurrentDomain.BaseDirectory.Contains("Blend 4")) 
          { 
           // load styles resources 
           ResourceDictionary rd = new ResourceDictionary(); 
           rd.Source = new Uri(System.IO.Path.Combine(Environment.CurrentDirectory, "Resources/Styles.xaml"), UriKind.Absolute); 
           Resources.MergedDictionaries.Add(rd); 
    
           // load any other resources this control needs such as Converters 
           Resources.Add("booleanNOTConverter", new BooleanNOTConverter()); 
          } 
         } 
    
         // initialize component 
         this.InitializeComponent(); 
    
    } 
    

    Es kann einige Grenzfälle sein, aber seine Arbeit für mich OK in den einfachen Fällen, in denen ich vor ein großes rotes Fehlersymbol bekommen würde. Ich würde gerne sehen, wie man dieses Problem besser lösen kann, aber das erlaubt mir zumindest, Benutzersteuerungen zu animieren, die sonst als Fehler erscheinen.


    Sie könnten auch die Schaffung von Ressourcen extrahieren, um App.xaml.cs:

    internal static void CreateStaticResourcesForDesigner(Control element) 
        { 
         if (AppDomain.CurrentDomain.BaseDirectory.Contains("Blend 4")) 
         { 
          // load styles resources 
          ResourceDictionary rd = new ResourceDictionary(); 
          rd.Source = new Uri(System.IO.Path.Combine(Environment.CurrentDirectory, "Resources/Styles.xaml"), UriKind.Absolute); 
          element.Resources.MergedDictionaries.Add(rd); 
    
          // load any other resources this control needs 
          element.Resources.Add("booleanNOTConverter", new BooleanNOTConverter()); 
         } 
        } 
    

    und dann in der Steuer dies tun, bevor InitializeComponent():

     // create local resources 
        if (DesignerProperties.GetIsInDesignMode(this)) 
        { 
         App.CreateStaticResourcesForDesigner(this); 
        } 
    

    Hinweis: Irgendwann hörte das für mich auf zu arbeiten und ich habe den Pfad zu Styles.xaml beca hartkodiert benutze ich habe, um herauszufinden, frustriert versuchen, welches Verzeichnis ich war.

    rd.Source = new Uri(@"R:\TFS-PROJECTS\ProjectWPF\Resources\Styles.xaml", UriKind.Absolute); 
    

    Ich bin sicher, dass ich den richtigen Weg mit 5 Minuten Arbeit finden konnte, aber versuchen Sie dies, wenn Sie auf Ihrem Verstand sind am Ende, wie ich war !

    +1

    Ich kann das nicht zur Arbeit bringen :( – jimplode

    +0

    @jimplode siehe Hinweis Ich habe gerade hinzugefügt –

    +0

    Vielen Dank! Die Lösung funktioniert perfekt für mich. – Dmitry

    0

    Stellen Sie sicher, dass die Mischung die gesamte Lösung und nicht nur das einzelne Projekt mit den Ansichten geöffnet hat. Ich habe mit der rechten Maustaste in Visual Studio geklickt und die Option In Expression Blend öffnen ausgewählt. Zu meiner Überraschung konnte Blend die Lösungsdatei nicht finden, sodass nur das einzelne Projekt geöffnet wurde.

    Als ich das erkannte, startete ich Blend direkt, zeigte auf die Lösungsdatei, und dann konnte Blend den ViewModelLocator aus meiner Sicht finden.

    1

    Ich hatte ein ähnliches Problem mit einer Benutzersteuerungsressource.
    Ich habe dies in meinem Usercontrol XAML-Code:

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

    Wo GinaControls der Namespace ist, wo die Steuerklasse deklariert und /Resources/GinaControlsColors.xaml ist der Projektordner und XAML-Ressourcendateinamen.

    Hoffe, das hilft.

    4

    In MyUserControl.xaml statt:

    DataContext="{Binding Main, Source={StaticResource Locator} 
    

    Verwendung:

    d:DataContext="{Binding Main, Source={StaticResource Locator} 
    

    wo "d" zuvor wurde wie folgt definiert:

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    
    +0

    Was ist der Vorteil in diesem Ansatz, ich bin ein Blend Newbie, also bin ich mein Gehirn um einige der Lösungen, die andere vorgebracht haben. – IbrarMumtaz

    1

    Nur diese fügen in Ihrer App.xaml.cs ganz am Anfang

    Hier ist mein Stück Code

    [STATThread()] 
    static void main(){ 
         App.Current.Resources.Add("Locator", new yournamespace.ViewModel.ViewModelLocator()); 
    } 
    
    public App(){ 
         main(); 
    }