5 Stimmen

Visual Studio kann die statische Ressource im WPF-Fenster nicht auflösen, obwohl sie zur Laufzeit funktioniert - warum?

Ich habe ein WPF-Fenster und verwende das MVVM-Muster. Ich setze das ViewModel als Ressource für das Fenster wie folgt...

Ich möchte den Datenkontext des Fensters verwenden, um auf die Ressource zuzugreifen, und habe festgestellt, dass das folgende XAML funktioniert...

Das Problem ist, dass ich dies nur manuell im XAML eingeben kann. Visual Studio zeigt die Ressource nirgendwo an. Ich kann zu den Eigenschaften des Fensters gehen und auf das kleine Symbol neben der DataContext-Eigenschaft klicken, die Option "Ressource anwenden" auswählen, jedoch wird "viewmodel" nicht als Ressource, statisch oder dynamisch, angezeigt. Wenn ich das XAML manuell eingebe und dann das Popup-Fenster "Ressource anwenden" öffne, wird "viewmodel" als Fehler unterstrichen, und wenn ich darauf zeige, wird ein Tooltip angezeigt "Ressourcenreferenz kann nicht aufgelöst werden"

Allerdings funktioniert es einwandfrei, wenn ich die Anwendung ausführe, also wird die Ressource tatsächlich zur Laufzeit aufgelöst.

Kann mir jemand das erklären? Ich würde wirklich gerne dies über den VS-Eigenschaftseditor machen können, da ich finde, dass das bequemer ist als das manuelle Eingeben des XAML. Mich stört auch, dass VS es nicht auflösen kann. Das lässt mich denken, dass ich etwas falsch mache.

Vielen Dank für jede Erklärung, die Sie geben können.

2voto

Eduardo Molteni Punkte 37808

Die einzige (traurige) Erklärung ist, dass XAML in Visual Studio ein Bürger zweiter Klasse ist. Sobald Sie XAML etwas anspruchsvoller verwenden und mit "nicht aufgelöst", "kann nicht angezeigt werden", "Entschuldigung, ich bin dumm", etc. enden.

Beachten Sie diesen WPF-Vorschlag: http://dotnet.uservoice.com/forums/40583-wpf-feature-suggestions/suggestions/480899-make-xaml-a-first-class-citizen-of-visual-studio?ref=title, um sie zu beheben.

2voto

Contango Punkte 70203

Es ist möglich, Intellisense zu 100% für ein XAML {StaticResource} in Visual Studio zum Laufen zu bringen.

Getestet auf

  • WPF/C#
  • Visual Studio 2015 Update 3

Schritt 1: Ressourcen in gemeinsames Projekt verschieben

Der Schlüssel ist, alle von ResourceDictionary referenzierten Ressourcen in ein gemeinsames Projekt zu verschieben:

Bildbeschreibung hier eingeben

Schritt 2: Designzeit-Intellisense

Wir sind noch nicht ganz dort. Der XAML-Laufzeitfehler tritt auf, wenn Ressourcen doppelt eingebunden sind.

Wenn wir eine .xaml-Datei mehr als einmal im gesamten Projekt einbinden, können wir sie zur Designzeit einbinden, aber nicht zur Laufzeit:

public class DesignTimeResourceDictionary : ResourceDictionary
{
    private Uri source;

    public new Uri Source
    {
        get
        {
            if ((bool)DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)
            {
                return null;
            }

            return this.source;
        }
        set { this.source = value; }
    }
}

Dann können wir Designzeit-Ressourcen hinzufügen:

Wenn wir ReSharper verwenden, wird es vorschlagen, das Namensraumpräfix automatisch in den Header einzufügen:

xmlns:dr="clr-namespace:MeinNamespace;assembly=Projekt.Name"

Anhang A: Zusätzlich für Experten: Warum der Bedarf nach Schritt 1?

Am Rande sei bemerkt, Intellisense in XAML ist dasselbe wie Intellisense in C#: es funktioniert nur mit referenzierten Unterprojekten. Deshalb müssen, wenn Projekte A und B Code teilen möchten, diesen in einer Klassenbibliothek C platzieren, die von Projekten A und B referenziert wird. Dies steht im Gegensatz zu C oder C++, wo das Einbinden einer Datei im Stammverzeichnis sie für alle Unterdateien verfügbar macht.

Bei XAML kann man betrügen und statische Ressourcen in das Hauptanwendungsprojekt einfügen (oben), und der XAML-Laufzeitfehler wird weiterhin ordnungsgemäß funktionieren – aber Intellisense wird in der Designzeit nicht funktionieren, vermutlich weil es auf demselben Motor basiert, der für C#-Intellisense verwendet wird.

Um Intellisense in XAML ständig zum Laufen zu bringen, müsste das Visual Studio-Intellisense durch jede übergeordnete Projekt (statt nur nach unten zu referenzierten Projekten) hindurchsuchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X