Fehler: System.InvalidOperationException bei WPF Navigation

  • WPF

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Fehler: System.InvalidOperationException bei WPF Navigation

    Hallöchen,

    ich bin gerade dabei die Navigation meines Programmes zu bauen. Ich kriege das zurzeit auch relativ gut hin. Allerdings, wenn ich bspw. einen Button baue, um wieder zurück auf die Startseite zu kommen, dann kommt folgender Fehler:

    Quellcode

    1. ​System.InvalidOperationException: "Bei dem Window muss es sich um den Stamm der Struktur handeln. "add Window" ist als untergeordnetes Element von "Visual" nicht zulässig."


    C#-Quellcode

    1. private void Button_Click_1(object sender, RoutedEventArgs e)
    2. {
    3. MainWindow main = new MainWindow();
    4. this.Content = main;
    5. }
    Mit Freundlichen Grüßen
    AtomiX
    @AtomiX Was für eine Klasse ist denn this?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    this ist ein Window. Auf diesem Window versucht @AtomiX als Content ein Window zu setzen. Das funktioniert natürlich nicht.

    @AtomiX
    Packe den Inhalt welcher im Mainwindow ist in ein Usercontrol.
    Dann kannst du mit this.Content = meineUsercontrolInstanz den Content zuweisen.

    Denn der Inhalt eines Fensters kann kein Fenster sein. Du kannst als anders ausgedrückt kein Fenster in ein Fenster packen.
    Was noch ginge wäre: this.Content = main.Content;

    Das Problem ist hier, wenn du im MainWindow evtl. Resourcen eingebunden hast, der Content des MainWindow in einem anderen Window nicht Lauffähig ist.
    Aber dafür haben wir zu wenig Infos von dir bekommen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ich würde sagen, Window bzw. MainWindow (bitte korrigieren, wenn das falsch bzw. kein Sinn machen sollte (!) ).

    ## UPDATE ##
    @Nofear23m , Vielen Dank für deine Antwort!
    d.h. ich muss einfach nur bei meinem MainWindow die Tags zu UserControl ändern? oder muss ich da jetzt nochmal ein neues UserControl anlegen?
    Weil vom Prinzip her ist mein MainWindow meine Hauptseite, bei der die meisten Funktionen vor liegen.

    *Farbe ROT entfernt, diese ist der Moderation vorbehalten!!* ~NoFear23m
    Mit Freundlichen Grüßen
    AtomiX

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Nofear23m“ ()

    Da du keinen XAML zeigst und auch nicht die ganz oder relevanten Stellen der Codebehind könnte ich nur raten.

    Ich glaube ja zu wissen was in etwa du genau vorhast und da muss ich dir sagen das man das anders unter WPF macht.

    Beschreib doch am besten was du vorhast und vieleicht finden wir emja eine viel bessere Lösung.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ok. Alles klar. Da wäre jetzt meine Frage, welchen Teil des Codebehinds benötigst du? :)

    Grundsätzlich habe ich als Einsteiger-Projekt ein Prozentrechner vor, weil ich gerade Anfange mir WPF beizubringen. Da mein Prozentrechner soweit fertig ist, wollte ich mich jetzt mal mit der Navigationen und den Pages beschäftigen. Es funktioniert soweit auch schon gut von dem MainWindow auf die einzelnen Pages zu kommen, allerdings weiß ich nicht wie ich wieder zum MainWindow komme.
    Und das probier ich durch eure Hilfe zu verstehe und umzusetzen ;)
    Mit Freundlichen Grüßen
    AtomiX
    Hallo

    Ja, erstmal wäre interessant was du mit "Pages" meinst. Pages gibt es in UWP aber nicht in WPF. Was sind bei dir Pages?
    Was ist mit Navigation gemeint? Tauscht du einfach den Content von Mainwindow um eine "Navigation" zu simulieren?

    Der ablauf deines Programs wäre schon interessant, bzw. der Code wie du zu einer "Page" Navigierst damit wir sehen können WAS du hier überhaupt machst da das alles schon unorthodox klingt.
    Nur so können wir dir Helfen. Du musst rechnen, wir sitzen nicht davor und kennen dein Projekt nicht.

    Meine Tutorialreihe kennst du?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Also mit Pages meine ich vom Prinzip her einfach nur Seiten, zu den ich springen kann.
    Beispielsweise habe ich eine Page namens "HilfeAnzeigen" und eine Page namens "InfoAnzeigen", zu den ich wechseln möchte, sofern man bei einer Menubar auf das jeweilige Menuitem gedrückt hat.

    Hier ist mein Mainwindow Code:

    C#-Quellcode

    1. private void MenuItem_Click_Hilfe(object sender, RoutedEventArgs e)
    2. {
    3. HilfeAnzeigen hilfeAnzeigen = new HilfeAnzeigen();
    4. this.Content = hilfeAnzeigen;
    5. }
    6. private void MenuItem_Click_Info(object sender, RoutedEventArgs e)
    7. {
    8. InfoAnzeigen infoAnzeigen = new InfoAnzeigen();
    9. this.Content = infoAnzeigen;
    10. }


    Und dann auf HilfeAnzeigen, habe ich das folgende um wieder auf die MainWindow zu gelangen, allerdings kommt da der genannte Fehler:

    C#-Quellcode

    1. private void Button_Click_1(object sender, RoutedEventArgs e)
    2. {
    3. MainWindow main = new MainWindow();
    4. this.Content = main.Content;
    5. }
    Mit Freundlichen Grüßen
    AtomiX
    Hallo

    Erstmal muss ich sagen. Versuche immer sofern möglich mit Binding zu arbeiten.

    Hier ein kleines Beispiel um den Content eines ContentControls dynamische zu ändern.

    XAML

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:SwipeContentDemo"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Grid>
    10. <Grid.ColumnDefinitions>
    11. <ColumnDefinition Width="Auto"/>
    12. <ColumnDefinition Width="*"/>
    13. </Grid.ColumnDefinitions>
    14. <StackPanel Margin="10">
    15. <StackPanel.Resources>
    16. <Style TargetType="Button">
    17. <Setter Property="Padding" Value="5"/>
    18. <Setter Property="Margin" Value="3"/>
    19. <Setter Property="FontSize" Value="18"/>
    20. </Style>
    21. </StackPanel.Resources>
    22. <Button x:Name="btnSwitchContent1" Content="Zeige MainContent" Click="SwitchContent_Click"/>
    23. <Button x:Name="btnSwitchContent2" Content="Zeige SuperContent" Click="SwitchContent_Click"/>
    24. <Button x:Name="btnSwitchContent3" Content="Zeige TestContent" Click="SwitchContent_Click"/>
    25. <Button x:Name="btnSwitchContent4" Content="Zeige Info" Click="SwitchContent_Click"/>
    26. </StackPanel>
    27. <ContentControl Grid.Column="1" Content="{Binding CurrentContent}"/>
    28. </Grid>
    29. </Window>


    Code

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Class MainWindow
    3. Implements INotifyPropertyChanged
    4. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    5. CurrentContent = New MainContent
    6. Me.DataContext = Me
    7. End Sub
    8. Dim _currentContent As Object
    9. Property CurrentContent As Object
    10. Get
    11. Return _currentContent
    12. End Get
    13. Set
    14. _currentContent = Value
    15. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(CurrentContent)))
    16. End Set
    17. End Property
    18. Private Sub SwitchContent_Click(sender As Object, e As RoutedEventArgs)
    19. Select Case DirectCast(sender, Button).Name
    20. Case "btnSwitchContent1"
    21. CurrentContent = New MainContent
    22. Case "btnSwitchContent2"
    23. CurrentContent = New SuperContent
    24. Case "btnSwitchContent3"
    25. CurrentContent = New TestContent
    26. Case "btnSwitchContent4"
    27. CurrentContent = New Info
    28. Case Else
    29. Throw New Exception("Unbekannter Name des Buttons.")
    30. End Select
    31. End Sub
    32. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    33. End Class

    MainContent, SuperContent, TestContent, Info sind jeweils immer UserControls.

    Willst du nun zurück zum "normalen Content" wie beim Start musst du die Eigenschaft einfach nur so setzen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ok. Alles klar vielen Dank.

    Nofear23m schrieb:

    Willst du nun zurück zum "normalen Content" wie beim Start musst du die Eigenschaft einfach nur so setzen.


    Wie muss ich den setzen? Wie oben im Code?
    Mein Problem ist halt, ich kann nicht viel mit VB anfangen, weil ich mich noch nie damit beschäftigt habe.
    Mit Freundlichen Grüßen
    AtomiX

    AtomiX schrieb:

    ich kann nicht viel mit VB anfangen, weil ich mich noch nie damit beschäftigt habe.

    Sorry, aber das ist keine Ausrede. In VB CurrentContent = New MainContent in C# zu übersetzen (CurrentContent = new MainContent() ist wirklich trivial.

    Das einzige problem auf welches du stoßen könntest (ich kenne deine Code-Struktur nicht) ist das du von einer anderen Klasse aus das Property setzen müsstest. In diesem Fall kannst du die Instanz aber z.b. im Konstruktor ja mitgeben.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##