Laden...

Navigation zwischen mehreren Pages

Letzter Beitrag vor 24 Tagen 6 Posts 231 Views
Navigation zwischen mehreren Pages

Hallo allerseits,

ich bin neu hier und beigetreten, weil ich einerseits Hilfe brauche, aber mich auch weiterbilden will.

Jedenfalls ist mein Problem folgendes: Ich will ein Menü in WPF erstellen, das mit Windows/Pages arbeitet

Das Hauptmenü beim Start hat 3 Buttons.
Button 1 ist der Start des Spiels, also die Navigation in eine andere Page
Button 2 führt zum Scoreboard, ebenfalls eine andere Page
Button 3 beendet die Anwendung (funktioniert schon)

Im Scoreboard gibt es einen Button, der zum Hauptmenü führt
Wenn man beim Spiel gewinnt, kommen zwei Buttons, die einen entweder ins Hauptmenü führen oder zum Scoreboard
Wenn man verliert, dann kann man sich ebenfalls zwischen Scoreboard und Hauptmenü entscheiden

Die Struktur wie ich die Buttons will, hab ich schon geplant, aber mir fehlt jetzt das Know-How für die Umsetzung zu den einzelnen Pages. Ich hab es mit einem Frame probiert, aber dann konnte ich meine Buttons nicht mehr betätigen.

Vielen Dank fürs Lesen!

Hallo und willkommen,

ist das eines deiner ersten Projekte mit WPF? Und kennst bzw. verwendest du schon MVVM (s. [Artikel] MVVM und DataBinding)?

Ein gutes Beispiel mit MVVM für die Navigation zwischen verschiedenen Seiten ist Navigation mit WPF und MVVM. Als MVVM-Framework verwendet es MvvmLight Framework, aber du kannst auch ein anderes, wie das bekannte MVVM-Toolkit (als Teil des  .NET Community Toolkit) verwenden, s.a. Einführung in das MVVM-Toolkit (teilweise heißen die Klassen und Methoden dann dort anders).

Und bzgl.

Ich hab es mit einem Frame probiert, aber dann konnte ich meine Buttons nicht mehr betätigen.

Dazu solltest du uns den betreffenden Code zeigen.

Alternativ könnte man auch ein TabControl benutzen. Aber probier den Link von Th69 auf jeden Fall aus.

Mit MVVM wollte ich mich erst später beschäftigen, weil ich mir dachte, dass mein Vorhaben ohne dem auch möglich wäre. Die Zeile mit dem Frame hab ich nicht mehr, weil ich das ziemlich schnell aufgegeben hatte.
Das ist soweit eben mein Versuch. Im xaml ist nur das Grid und ein Textblock

public partial class MainWindow : Window
{
    public MainWindow()
    {
        this.DataContext = DataContext;
        InitializeComponent();
        Button start = new Button();
        Button score = new Button();
        Button exit = new Button();

        start.Content = "START GAME";
        start.Name = "btn_start";
        start.Click += btn_start_Click;
        start.Width = 200;
        start.VerticalAlignment = VerticalAlignment.Center;
        start.HorizontalAlignment = HorizontalAlignment.Center;
        start.Background = Brushes.Blue;
        start.Foreground = Brushes.White;
        start.FontFamily = new FontFamily("Lucida Console");
        start.FontSize = 20;
        start.Padding = new Thickness(5, 5, 5, 5);
        Grid.SetRow(start, 2);

        score.Content = "SCOREBOARD";
        score.Name = "btn_score";
        score.Click += btn_score_Click;
        score.Width = 200;
        score.VerticalAlignment = VerticalAlignment.Center;
        score.HorizontalAlignment = HorizontalAlignment.Center;
        score.Background = Brushes.Blue;
        score.Foreground = Brushes.White;
        score.FontFamily = new FontFamily("Lucida Console");
        score.FontSize = 20;
        score.Padding = new Thickness(5, 5, 5, 5);
        Grid.SetRow(score, 3);

        exit.Content = "EXIT";
        exit.Name = "btn_exit";
        exit.Click += btn_exit_Click;
        exit.Width = 200;
        exit.VerticalAlignment = VerticalAlignment.Center;
        exit.HorizontalAlignment = HorizontalAlignment.Center;
        exit.Background = Brushes.Blue;
        exit.Foreground = Brushes.White;
        exit.FontFamily = new FontFamily("Lucida Console");
        exit.FontSize = 20;
        exit.Padding = new Thickness(5, 5, 5, 5);
        Grid.SetRow(exit, 4);

        MainMenuGrid.Children.Add(start);
        MainMenuGrid.Children.Add(score);
        MainMenuGrid.Children.Add(exit);
    }

    /// <summary>
    /// Method to handle the buttonpress for the exit function
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btn_exit_Click(object sender, RoutedEventArgs e)
    {
        //Closes the application
        Application.Current.Shutdown();
    }

    /// <summary>
    /// Method to handle the buttonpress for the scoreboard
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btn_score_Click(object sender, RoutedEventArgs e)
    {

        //Change Context of the window/frame to the scoreboard page
        //NavigationService.Navigate(new Scoreboard());
    }

    /// <summary>
    /// Method to handle the buttonpress for the start of the game
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btn_start_Click(object sender, RoutedEventArgs e)
    {
        //Change context of the window/frame to the game page

    }
}

WPF ist so konzipiert, dass MVVM verwendet wird. Du wirst dutzende von Workarounds brauchen, wenn Du MVVM nicht verwenden willst; das ist nicht zu empfehlen. Vor allem braucht man oft mehr Zeit das später richtig zu migrieren, als es gleich richtig zu starten.
Ja, das macht die Einstiegshürde von WPF relativ hoch - ist aber leider so.

weiterbilden

Zwecks Beschleunigung und als Ergänzung zum bereits Geschriebenen: Programmierung (z.B. mit C#) ist ist die Frage wie sich der Compiler verhält, wenn er im Quellcode auf ein Schlüsselwort (i.V. mit anderen Schlüsselwörtern) (nicht) trifft. Die Quelle des SW (C#-Compiler-Version, Frameworks wie MVVMLight,...) ist dabei egal.   Aus menschlicher Sicht soll(te) man die weniger (oder gar nicht) veränderlichen Teile des Codes zusammenfügen und die mit (sehr) hoher Änderungsrate geeignet auslagern ( Ziel: man will Änderungen oder Erweiterungen an einer Stelle erleichtern).  Ein Schlagwort wie MVVM i.V. mit WPF gibt hierbei Empfehlungen, welche Teile des Codes (z.B. Events) man wie behandeln könnte.

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉