简体   繁体   中英

How to navigate to a new page in xamarin forms using ONLY c#

I am working on a simple app that keeps track of life for a card game. I am very new to xamarin so I am starting small and just slowly adding more functionality. Currently, I have two pages; One page (the page it starts on (root page?) that has only one lifetotal number, two buttons for incrementing and decrementing, and one button to switch to a two player layout, and then a second page with two lifetotals and 4 buttons (an increment and decrement for each lifetotal). I am writing all of this in C# and I would like to keep it that way, however, I am having trouble finding a way to make it so that button that switches to the two player layout will present the second page. Everything ive googled seems to point back to xml which I want to avoid. Can anyone help me understand how to do this?

I am building off an app my buddy made for to understand how xamarin works so thats what all the weird comments are

code: (the delegate i need to fill in is at the bottom, called moreplayers)

namespace SampleApp
 {
//contentpage is the base class for all pages.
//You should make a base class for this page that isn't contentpage, but inherits from content page, then you can add custom methods that extend across all pages.
//Like adding a progress spinner, or disabling all UI elements.
public class MainPage : ContentPage
{

    public MainPage()
    {
        CreateUI();
    }

    private void CreateUI()
    {
        Stats Player1 = new Stats();

        Player1.LifeTotal = 20;

        //abstracting out a function to build UI is good, but breaking this down further is better.
        var MainGrid = new Grid()//grids are the bread and butter of xamarin forms, the documentation has lots of good examples I won't try to replicate here.
        {
            HorizontalOptions = LayoutOptions.FillAndExpand,//these are on all UI elements, gotta specify them or the default values will probably screw up.
            VerticalOptions = LayoutOptions.FillAndExpand
        };

        //I usually make a bunch of nice extensions on the Grid to add rows and columns easily
        MainGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });
        MainGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });

        MainGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });

        //grid where life total label will live
        var GridForLifeTotal = new Grid()
        {
            HorizontalOptions = LayoutOptions.FillAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand
        };
        GridForLifeTotal.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });
        GridForLifeTotal.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });

        GridForLifeTotal.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });

        //grid where buttons will live
        var GridForButtons = new Grid()
        {
            HorizontalOptions = LayoutOptions.FillAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand
        };
        GridForButtons.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });
        GridForButtons.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });

        GridForButtons.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });

        MainGrid.Children.Add(GridForLifeTotal, 0, 0); //add items to the grid based on position
        MainGrid.Children.Add(GridForButtons, 0, 1);

        //Add labels
        var lifeLabel = new Label()
        {
            Text = Player1.LifeTotal.ToString(),
            FontAttributes = FontAttributes.Bold,
            HorizontalOptions = LayoutOptions.Center,
            VerticalOptions = LayoutOptions.Center,
            FontSize = 60
        };

        GridForLifeTotal.Children.Add(lifeLabel, 0, 0);

        //Add buttons
        var UpButton = new Button()
        {
            Text = "+",
            FontAttributes = FontAttributes.Bold,
            HorizontalOptions = LayoutOptions.Center,
            VerticalOptions = LayoutOptions.Center,
            FontSize = 30
        };

        UpButton.Clicked += delegate {
            //delegates are bad form but it's late and I'm tired you should put this login in a view model class and have that view model be a private property on this view.
            //View (this), View Model (the logic layer) then a Model to hold the life total and any other user data?
            Player1.LifeTotal += 1;
            lifeLabel.Text = Player1.LifeTotal.ToString();
        };

        var DownButton = new Button()
        {
            Text = "-",
            FontAttributes = FontAttributes.Bold,
            HorizontalOptions = LayoutOptions.Center,
            VerticalOptions = LayoutOptions.Center,
            FontSize = 30
        };

        DownButton.Clicked += delegate {
            //delegates are bad form but it's late and I'm tired
            Player1.LifeTotal -= 1;
            lifeLabel.Text = Player1.LifeTotal.ToString();
        };

        var MorePlayers = new Button()
        {
            Text = "2 Player Game",
            FontAttributes = FontAttributes.Bold,
            HorizontalOptions = LayoutOptions.End,
            VerticalOptions = LayoutOptions.End,
            FontSize = 30
        };

        MorePlayers.Clicked += delegate
        {
            //need to figure out what goes here
        };

        GridForButtons.Children.Add(UpButton, 0, 0);
        GridForButtons.Children.Add(DownButton, 1, 0);
        GridForButtons.Children.Add(MorePlayers, 0, 1);

        Content = MainGrid;//very important, otherwise you don't actually see anything you've built

    }

}

}

first, you need to wrap MainPage in a NavigationPage when you first assign it in your App.xaml.cs

MainPage = new NavigationPage(new MainPage());

then, to navigate to the next page in your delegate

this.Navigation.PushAsync(new Page2());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM