Страница не будет отображаться вообще, несмотря на отсутствие ошибок - PullRequest
0 голосов
/ 22 марта 2020

В течение последнего часа я снова и снова перечитываю свой код и не могу понять, почему добавленные мной изменения не позволяют отображать мою страницу (страница, которая не отображается, - NameEntryPage). Приложение запускается на стартовой странице, которая имеет две кнопки, позволяющие пользователю выбрать либо игру для одного игрока, либо игру для двух игроков. Если пользователь выбирает игру двух игроков, он переходит к NameEntryPage, где пользователь может вводить имена для двух игроков. NameEntryPage имеет кнопку, которая при нажатии передает введенные имена и перемещается в TwoPlayerPage. Я проверил StartPage, OnePlayerPage и TwoPlayerPage, и они все еще работают. Однако NameEntryPage ничего не загружает (и кнопка на StartPage, которая ведет вас туда, тоже не работает. Чтобы проверить другие страницы, мне пришлось изменить код в App (), чтобы начать на этих страницах)

App () код

 public App()
     {
         InitializeComponent();
         MainPage = new NavigationPage(new Views.NameEntryPage());
     }

NameEntryPage.xaml код

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:d="http://xamarin.com/schemas/2014/forms/design"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         mc:Ignorable="d"
         x:Class="SampleApp.Views.NameEntryPage">
<ContentPage.Content>
    <StackLayout Margin="20">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
        </Grid>
        <Entry
               x:Name="EntryNameP1"
               Placeholder="Enter a name for Player 1"
               Text="{Binding NameP1}"
               Grid.Row="0" Grid.Column="0"/>

        <Entry x:Name="EntryNameP2"
               Placeholder="Enter a name for Player 2"
               Text="{Binding NameP2}"
               Grid.Row="1" Grid.Column="0"/>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Button Grid.Column="0" 
                Text="Start"/>
        </Grid>
    </StackLayout>
</ContentPage.Content>

код позади

namespace SampleApp.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class NameEntryPage : ContentPage
    {
        public NameEntryPage()
        {
            NavigationPage.SetHasNavigationBar(this, false);
            InitializeComponent();
            BindingContext = new NameEntryPageViewModel(Navigation, EntryNameP1.Text, EntryNameP2.Text);
        }
    }
}

код VM

public class NameEntryPageViewModel : INotifyPropertyChanged
{


    public INavigation Navigation { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        var changed = PropertyChanged;
        if (changed == null)
            return;

        changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private string nameP1;

    public string NameP1
    {
        get
        {
            return NameP1;
        }
        set
        {
            if (NameP1 != value)
            {
                nameP1 = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("NameP1"));
            }
        }
    }

    private string nameP2;

    public string NameP2
    {
        get
        {
            return NameP2;
        }
        set
        {
            if (NameP2 != value)
            {
                nameP2 = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("NameP1"));
            }
        }
    }


    public Command StartGameCommand { get; set; }


    public NameEntryPageViewModel(INavigation navigation, string name1, string name2)
    {

        nameP1 = name1;
        nameP2 = name2;
        this.Navigation = navigation;
        StartGameCommand = new Command(() => StartGame(nameP1, nameP2));

    }

    public NameEntryPageViewModel(INavigation navigation)
    {
        nameP1 = "Player 1";
        nameP2 = "Player 2";
        this.Navigation = navigation;
        StartGameCommand = new Command(() => StartGame(nameP1, nameP2));

    }

    private void StartGame(string name1, string name2)
    {

        this.Navigation.PushAsync(new Views.TwoPlayerPage(name1, name2));
    }

}

1 Ответ

1 голос
/ 22 марта 2020

это создаст бесконечное l oop

public string NameP1
{
    get
    {
        return NameP1;
    }

NameP1 вызовет метод получения для NameP1, который вызывает метод получения для NameP1, рекурсивно, пока вы не выполните sh

вместо этого ваш геттер должен вернуть private nameP1 переменную

public string NameP1
{
    get
    {
        return namep1;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...