Laden...

Verlinkungsproblem: System.Windows.Interactivity keine gültige Namespace-ID

Erstellt von robin_ vor 6 Jahren Letzter Beitrag vor 6 Jahren 7.546 Views
R
robin_ Themenstarter:in
38 Beiträge seit 2017
vor 6 Jahren
Verlinkungsproblem: System.Windows.Interactivity keine gültige Namespace-ID

Hallo,

Ich bin gerade dabei, ein Beispiel bzg. MVVM nachzubauen. Dort geht es gerade um EventTrigger-Objekte aus der Interactivity.dll - Erweiterung.

Ich kriege leider einen dicken Fehler, beim Versuch, den CLR-Namespace der Erweiterung bekannt zu geben:> Fehlermeldung:

Der URI "clr-namespace:System.Windows.Interactivity; assembly=System.Windows.Interactivity" ist keine gültige Namespace-ID

Wie zu sehen, habe ich die Lib referenzieren können (Siehe Bild), kriege den Fehler jedoch bei folgendem XAML-Code:

 xmlns:i="clr-namespace:System.Windows.Interactivity; assembly=System.Windows.Interactivity"

Nun meine Frage: Was mache ich falsch?

Danke schnmal,
MfG Robin

MfG Robin

16.806 Beiträge seit 2008
vor 6 Jahren

Die DLL stammt aus dem NuGet Paket vom Blend SDK. Prim verweist aber glaube ich auch drauf.
Hast Du das verwendet, oder wie hast Du die Referenz hinzugefügt?

Zudem hat sie IIRC nur eingeschränkte Kompatbilitäten, zB kein .NET 4.6

PS: Dein Beispiel scheint schon ein paar Monate auf dem Buckel zu haben.
Wär evtl. empfehlenswert ein aktuelleres Beispiel zu nehmen, denn die DLL wird schon ewig nicht mehr gepflegt bzw. ist Blend und auch das SDK schon seit Jahren abgekündigt und eingestellt.

2.078 Beiträge seit 2012
vor 6 Jahren

Probier mal das:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
R
robin_ Themenstarter:in
38 Beiträge seit 2017
vor 6 Jahren

Danke Palladin007, damit kriege ich schon Mal den Compiler-Fehler beim bekanntgeben der URI weg:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

Leider treten noch weitere Fehler an folgender Stelle auf:

<TextBox Text="{Binding PersonDetails, UpdateSourceTrigger=PropertyChanged}" Name="txtDetailInformation" Grid.Row="1" TextWrapping="Wrap" >
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="MouseEnter">
                            <i:InvokeCommandAction Command="{Binding MouseEnterCommand}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </TextBox>

Fehler:

Der Name "Interaction" ist im namespace xxx nicht vorhanden.

Nun zu den Fragen von Abt:
Ich habe das Buch C#6 mit Visual Studio 2015 - schien mir beim Kauf nicht soooo alt..

Ich habe einer Anleitung von der NuGet-Seite... Dort habe ich mit

Install-Package Expression.Blend.Sdk -Version 1.0.2

in der Nuget-Console versucht, das Package hinzuzufügen - was auch klappte.

Hast du vielleicht eine bessere Alternative, auf das Event im ViewModel zu reagieren? (Ohne Code in der XAML-Code-behind).

Danke.
MfG Robin

MfG Robin

M
177 Beiträge seit 2009
vor 6 Jahren

Fehler:

Der Name "Interaction" ist im namespace xxx nicht vorhanden.

Was sagt die IntelliSense im XAML Editor wenn du "<i:" eingibt? Oder schau besser in der Projektmappe unter den Referenzen nach. Doppelklick bei "System.Windows.Interactivity"

1.) Im Object Browser kannst du alle vorhandenen Klassen, Members usw. durchsuchen. Du musst darin alle Klassen finden die du im XAML verwenden möchtest.
2.) Wenn sich die "System.Windows.Interactivity" in einem packages Ordner befindet handelt es sich um das NuGet package das du mit Install-Package Befehl heruntergeladen hast. Sollte die in einem anderen Ordner liegen, wäre es möglich, dass auf eine falsche dll verwiesen hast.
Soweit ich mich erinnern kann wird mit Visual Studio 2015 und Blender die Interactivity Bibliothek mit ausgeliefert. Es kann also sein, dass du die Blender Dll einmal mittels Add Reference -> Add Assemblies -> Extensions und einmal per NuGet Package hinzugefügt hast. Das führt dann zu Fehler.

Ich habe einer Anleitung von der NuGet-Seite... Dort habe ich mit

Install-Package Expression.Blend.Sdk -Version 1.0.2  

in der NuGet-Console versucht, das Package hinzuzufügen - was auch klappte.

Ich kann noch ein passendes Paket empfehlen: Expression.Interaction
Damit kannst du, dann noch mehr im XAML anstellen. Beispiel siehe Anhang und unteren XAML Code:


            <TextBlock Text="click me ;)">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="MouseDown">
                        <i:InvokeCommandAction Command="{Binding Path=CloseCommand}" CommandParameter="textbox" />
                    </i:EventTrigger>
                    <i:EventTrigger EventName="MouseEnter">
                        <ie:ChangePropertyAction PropertyName="Background" Value="Yellow" />
                    </i:EventTrigger>
                    <i:EventTrigger EventName="MouseLeave">
                        <ie:ChangePropertyAction PropertyName="Background" Value="Green" />
                    </i:EventTrigger>                    
                </i:Interaction.Triggers>
                <Button Content="click me for setting the focus" Background="LightGoldenrodYellow">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Click">
                            <ie:CallMethodAction  TargetObject="{Binding}" MethodName="bla" IsEnabled="True" />
                        </i:EventTrigger>   
                    </i:Interaction.Triggers>
                </Button>
                <TextBox x:Name="texbox"  Text="" Width="200">
                    <i:Interaction.Triggers>
                        <ie:DataTrigger Binding="{Binding Path=IsMouseOver ,UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type TextBox}}}" Value="True">
                            <ie:ChangePropertyAction PropertyName="Background" Value="Blue" />
                        </ie:DataTrigger>
                        <ie:DataTrigger Binding="{Binding Path=IsMouseOver ,UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource AncestorType={x:Type TextBox}}}" Value="False">
                            <ie:ChangePropertyAction PropertyName="Background" Value="Purple" />
                        </ie:DataTrigger>
                    </i:Interaction.Triggers>
                </TextBox>
            </TextBlock>

Hast du vielleicht eine bessere Alternative, auf das Event im ViewModel zu reagieren? (Ohne Code in der XAML-Code-behind).

Eine bessere Möglichkeit gibt es nicht. Man kann sich Helper Klassen erstellen wie z.B. hier MVM: Event aus UserControl mit Command binden. Die kann man dann noch etwas allgemeiner ausführen, aber dann hat man früher oder später fast das gleiche wie das vom Expression.Blend.Sdk.

R
robin_ Themenstarter:in
38 Beiträge seit 2017
vor 6 Jahren

Danke für dein TestProjekt - kannst du das kompilieren? Ich nämlich nicht. Die Packages sind installiert (Siehe Bild), aber er findet wieder namespaces nicht 😕 Verstehe ich nicht 😦

Ich habe jetzt ein neues Projekt gemacht (Klick). In diesem habe ich über die NuGet - GUI probiert die Interactivity.dll hinzuzufügen. Hat auch geklappt, dachte ich.

Er erkennt den Namespace und auch die Tags wie i:Interaction.Triggers (schonmal ein Fortschritt) nur leider gibt es trotzdem noch Fehler...

An dieser Stelle ist das Buch echt nicht gut beschrieben... Ich vermute, dass es ein paar Kleinigkeiten sind, die ich bisher nicht verstanden habe... Vielleicht magst du mal drüber schauen?

Danke!

P.S: Sorry für den Dropbox-Link, die Zip von dem Projekt ist über der maximalen Uploadhöhe:/

MfG Robin

D
985 Beiträge seit 2014
vor 6 Jahren

Was für ein Visual Studio hast du denn? 2017, 2015, ...

(kann man auch im Profil hinterlegen)

R
robin_ Themenstarter:in
38 Beiträge seit 2017
vor 6 Jahren

Visual Studio 2017 Community

MfG Robin

M
177 Beiträge seit 2009
vor 6 Jahren

Bei deinem angehängten DropBox Projekt hast du das falsche Nuget Package installiert. Das ist bei mir auch nicht lauffähig. Das Nuget Package ist übrigens auch nicht von Microsoft veröffentlicht worden.

Wenn du das Nuget Package "Expression.Blend.Sdk" von Microsoft installierst, geht es.

R
robin_ Themenstarter:in
38 Beiträge seit 2017
vor 6 Jahren

Bei deinem angehängten DropBox Projekt hast du das falsche Nuget Package installiert. Das ist bei mir auch nicht lauffähig. Das Nuget Package ist übrigens auch nicht von Microsoft veröffentlicht worden.

Wenn du das Nuget Package "Expression.Blend.Sdk" von Microsoft installierst, geht es.

Danke, du hattest Recht, in dem kleinen Projekt hatte ich es hinbekommen.

Es gehört vielleicht nicht mehr zum Thema, aber was hat man falsch gemacht, wenn die InitializeComponents() als Fehler angezeigt wird? Ich habe beim googlen rausbekommen, dass es evt. damit zusammen hängt, dass man verschiedene Namespaces in der XAML/ Codebehind angibt - das ist nicht der Fall... Eine Idee?

Projekt

Danke!

//EDIT: Ich weiß nicht warum, aber das Problem hat sich in Luft aufgelöst. Ist mir jetzt schon öfters passiert, dass Probleme sich nach mehrmaligem neustarten von Visual selbst fixen... ist das normal?

MfG Robin

D
985 Beiträge seit 2014
vor 6 Jahren

Du meinst wohl eher die Methode InitializeComponent().

Diese Methode ist eine automatisch generierte Methode und die kann generiert werden oder eben auch nicht. Basis für die Generierung ist die zugehörige XAML-Datei.

Hier ein Beispiel:

Von dieser App.xaml


<Application x:Class="WpfApp15.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp15"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
         
    </Application.Resources>
</Application>

wird folgende App.i.g.cs erzeugt


namespace WpfApp15 {
    
    
    /// <summary>
    /// App
    /// </summary>
    public partial class App : System.Windows.Application {
        
        /// <summary>
        /// InitializeComponent
        /// </summary>
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
        public void InitializeComponent() {
            
            #line 5 "..\..\App.xaml"
            this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);
            
            #line default
            #line hidden
        }
        
        /// <summary>
        /// Application Entry Point.
        /// </summary>
        [System.STAThreadAttribute()]
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
        public static void Main() {
            WpfApp15.App app = new WpfApp15.App();
            app.InitializeComponent();
            app.Run();
        }
    }
}

und nun entfernen wir einmal den StartupUri Eintrag aus der App.xaml


<Application x:Class="WpfApp15.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp15">
    <Application.Resources>
         
    </Application.Resources>
</Application>

und bekommen dadurch folgende App.i.g.cs erzeugt


namespace WpfApp15 {
    
    
    /// <summary>
    /// App
    /// </summary>
    public partial class App : System.Windows.Application {
        
        /// <summary>
        /// Application Entry Point.
        /// </summary>
        [System.STAThreadAttribute()]
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
        public static void Main() {
            WpfApp15.App app = new WpfApp15.App();
            app.Run();
        }
    }
}

Zudem gibt es noch die App.xaml.cs


namespace WpfApp15
{
    /// <summary>
    /// Interaktionslogik für "App.xaml"
    /// </summary>
    public partial class App : Application
    {
        public App()
        {
        }
    }
}

Wenn du hier im Konstruktor diese InitializeComponent() Methode aufrufst und es diese Methode aber gar nicht gibt (weil diese eben nicht generiert wird) dann wird das auch zurecht angemeckert.

Allerdings sollte in der App-Klasse diese Methode nicht von dir aufgerufen werden. Das macht der generierte Code von selber (siehe App.i.g.cs) und ein doppeltes Initialisieren kann Probleme verursachen.

Bei jedem Window passiert fast das Gleiche, allerdings mit dem Unterschied, dass die Methode InitializeComponent() immer erzeugt wird und diese Methode im Konstructor aufgerufen werden muss.

Der generierte Code der Methode sorgt dafür, dass die wirkliche Initialisierung in dieser Methode gesichert nur einmal pro Instanz durchlaufen wird, unabhängig davon, wie oft man InitializeComponent() aufruft.

Da es sich um eine automatische Generierung von Dateien handelt, kann es durchaus sein, dass dir auch dein Virenscanner einen Streich spielt und einfach mal dazwischen grätscht. Also alle Virenscanner mal totlegen und dann das Verhalten beobachten.

R
robin_ Themenstarter:in
38 Beiträge seit 2017
vor 6 Jahren

Übrigens etwas, was mir in meiner Zeit mit VS nun aufgefallen ist:

Öfters habe ich Fehler im XAML-Code (z.B. findet er Klassen in Namespaces nicht etc.)...

Wenn ich Neustarte kann das das Problem beheben, anderenfalls reicht ein klick auf "Run" und der Fehler löst sich in Luft auf.

(Natürlich nur, wenn auch alles richtig ist.)

Ist für einen Anfänger wie mich sehr ärgerlich, weil man nicht immer sich ja nicht immer sicher ist mit der richtigen Ausführung mancher Befehle...

MfG Robin