11 Stimmen

Assembly, das nur in XAML verwendet wird, wird nicht in den Bin-Ordner kopiert

Im WPF-Projekt werden Verweise, die nur in xaml verwendet werden, nicht in den bin-Ordner kopiert, auch nicht mit CopyLocal auf true gesetzt, wie es in diese Stelle . Bei MVVM-Mustern ist es üblich, dass Steuerelemente von Drittanbietern ohne jegliche Code-Behind-Referenzen verwendet werden.

Inspiriert durch diese Stelle Ich verwende die nachstehende Abhilfe. Es ist einfach genug, aber man muss die Variablenliste manuell mit den tatsächlich in den XAML-Dateien des Projekts verwendeten Variablen synchronisieren, die ständigen Änderungen unterliegen. Meine Frage ist, ob es eine echte Lösung oder einen besseren Workaround gibt? (Ich kenne die Idee, ein Post-Build-Skript zu verwenden, das IMHO weniger leicht auffindbar und anfälliger für Änderungen ist).

internal static class BuildTricker
{
    private static readonly RadTreeView radTreeView;
    static BuildTricker()
    {
        // Set and get once to avoid compiler optimization.
        radTreeView = null;
        if (radTreeView != null)
        {
            throw new InvalidOperationException("This should never happen.");
        }
    }
}

9voto

Mark Punkte 1694

Die Abhilfe, die ich verwende, besteht darin, sicherzustellen, dass das Element einen in der XAML definierten Namen hat. Dadurch wird im generierten Code hinter der (partiellen) Klasse eine Instanz für das Element erstellt. Dies ist genug für die Referenz folgenden System, um den Verweis zu erkennen, und kopieren Sie in der Abhängigkeit dll.

z.B.:

<ts:HorizontalToggleSwitch IsChecked="{Binding ShowMyItemsOnly}"
                           CheckedContent="Show My Items Only"
                           UncheckedContent="Show All Items"
                           x:Name="NameRequiredForCopyLocal">

2voto

Michi-2142 Punkte 1088

Dies ist ein bekanntes Problem mit XAML-Code. Beim Parsen des XAML-Codes kommt es zu einem merkwürdigen Verhalten, da VisualStudio weiß, dass die entsprechende DLL verwendet wird. In meinem Fall hat es geholfen, ein Attribut eines beliebigen Objekts aus der spezifischen DLL in der Code Behind Klasse oder einer beliebigen Klasse im Projekt zu erstellen. (Abhilfe)

Zum Beispiel:

// This is only for the build process, to copy target assembly to output.
private RadTreeView _TreeViewForCompiler;

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