0

パックマンの Windows ストア アプリ ゲームを作成しています。win2d ライブラリを使用してアニメーションを作成します。ページ間のナビゲーションに問題があります。これが私のメインページです。新しいゲームを作成します。

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        //Game gm = new Game();
    }

    private void playButton_Click(object sender, RoutedEventArgs e)
    {
        Game gm = new Game();
    }

    private void exitButton_Click(object sender, RoutedEventArgs e)
    {
        Application.Current.Exit();
    }

    private void resultsButton_Click(object sender, RoutedEventArgs e)
    {

    }
}

しかし、ゲームクラスでは、終了時にメインページに戻る必要があります。私は多くの方法を試しましたが、うまくいきません。ゲームクラス:

public Game()
{
    this.InitializeComponent();
    Window.Current.Content = this;
}

private void canvas_CreateResources(CanvasAnimatedControl sender, Microsoft.Graphics.Canvas.UI.CanvasCreateResourcesEventArgs args)
{
    args.TrackAsyncAction(CreateResourcesAsync(sender).AsAsyncAction());
}

async Task CreateResourcesAsync(CanvasAnimatedControl sender)
{
    ghostImages = new List<CanvasBitmap>();
    ghostImages.Add(await CanvasBitmap.LoadAsync(sender.Device, new Uri("ms-appx:///Assets/ghost1.png")));
    ghostImages.Add(await CanvasBitmap.LoadAsync(sender.Device, new Uri("ms-appx:///Assets/ghost2.png")));
    ghostImages.Add(await CanvasBitmap.LoadAsync(sender.Device, new Uri("ms-appx:///Assets/ghost3.png")));
    ghostImages.Add(await CanvasBitmap.LoadAsync(sender.Device, new Uri("ms-appx:///Assets/ghost4.png")));
    ghostImages.Add(await CanvasBitmap.LoadAsync(sender.Device, new Uri("ms-appx:///Assets/Pacman_25.png")));
    StartNewGame();
}

private void Canvas_Draw(ICanvasAnimatedControl sender, CanvasAnimatedDrawEventArgs args)
{
    Map.drawBorders(args);
    using (var session = args.DrawingSession)
    {
        session.DrawImage(hero.getImage1(), hero.getX(), hero.getY());
        for (int i = 0; i < ghostList.ToArray().Length; i++)
        {
            session.DrawImage(ghostList[i].getImage(), ghostList[i].getX(), ghostList[i].getY());
        }
        int bestScore = 1, score = 3;
        session.DrawText("Rekordas: " + bestScore, Constants.WIDTH / 3 * 1.8f, Constants.HEIGHT + Constants.SHOWINFOSIZE / 2, Windows.UI.Colors.White);
        session.DrawText("Rezultatas: " + score, Constants.BLOCKSIZE, Constants.HEIGHT + Constants.SHOWINFOSIZE / 2, Windows.UI.Colors.White);
        session.DrawText("Gyvybės: ", Constants.BLOCKSIZE, Constants.HEIGHT + Constants.SHOWINFOSIZE / 1, Windows.UI.Colors.White);
        for (int i = 0; i < 3; i++)
            session.DrawImage(hero.getImage1(), Constants.BLOCKSIZE + 150 + (Constants.BLOCKSIZE + 5) * i, (int)Constants.HEIGHT + Constants.SHOWINFOSIZE / 1 - Constants.BLOCKSIZE + 5);
    }
}

public void GameOver()
{
    playing = false;
    //Frame.Navigate(typeof(MainPage));
    //Dispose();
    //this.Dispose();
    //var page = new MainPage();
    //Window.Current.Content = page;
    //MainPage mn = new MainPage();
    //if (name == null)
    //{
    //    name = "Student";
    //}
    //Window.Current.Content = new MainPage();
    //mn.UpdateLayout();
}

ページ間を移動するにはどうすればよいですか? ありがとう。

4

2 に答える 2

1

役に立つと思われるいくつかのメソッドを次に示します (ナビゲーション ロジックを内部にラップするために使用するクラスから)

//Better made the class a singleton but I've skipped that part to for brifety
public class Navigation 
{
    public bool CanGoBack
    {
        get
        {
            var frame = ((Frame)Window.Current.Content);
            return frame.CanGoBack;
        }
    }

    public Type CurrentPageType
    {
        get
        {
            var frame = ((Frame)Window.Current.Content);
            return frame.CurrentSourcePageType;
        }
    }

    public virtual void GoBack()
    {
        var frame = ((Frame)Window.Current.Content);

        if (frame.CanGoBack)
        {
            frame.GoBack();
        }
    }

    public virtual void NavigateTo(Type sourcePageType)
    {
        ((Frame)Window.Current.Content).Navigate(sourcePageType);
    }

    public virtual void NavigateTo(Type sourcePageType, object parameter)
    {
        ((Frame)Window.Current.Content).Navigate(sourcePageType, parameter);
    }

    public virtual void GoForward()
    {
        var frame = ((Frame)Window.Current.Content);

        if (frame.CanGoForward)
        {
            frame.GoForward();
        }
    }
}

次のように使用します (前述のメソッドがインスタンスを持つ Navigation という名前のクラスにあると仮定した場合):

//To go to Game page
Navigation.NavigateTo(typeof(Game));

//To go to Main page and pass some arguments
Navigation.NavigateTo(typeof(MainPage), winnerId);

//To go back
Navigation.GoBack();

添加

次のように、渡されたパラメーターをビューで受け取ることができます。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    var receivedParameter = e.Parameter as TheTypeOfThePassedParameter;
}

データを渡すための追加のオプションは、アプリ全体で利用したい値を含む 1 つの静的またはシングルトン アプリケーション用クラス (どこからでも見える) を作成することです。

于 2015-11-02T21:09:49.110 に答える
0

アプリのナビゲーション ロジックとコンテンツを管理するには、Model View View Model パターンを検討することをお勧めします。(Channel9紹介動画)

ナビゲーションを支援するために、いくつかの便利なナビゲーション メソッドを公開するMVVM Light ライブラリを使用できます。

ViewModelLocator.cs では、ナビゲートするすべてのページの文字列を定義できます。

static ViewModelLocator()
{
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

    var nav = new NavigationService();
    nav.Configure("MainMenu", typeof(MainMenuView));
    nav.Configure("About", typeof(AboutView));
    nav.Configure("Game", typeof(GameView));

    SimpleIoc.Default.Register<INavigationService>(() => nav);

    SimpleIoc.Default.Register<MainMenuViewModel>();
    SimpleIoc.Default.Register<AboutViewModel>();
    SimpleIoc.Default.Register<GameViewModel>();
}

典型的な ViewModel は次のようになります。

public class GameViewModel : ViewModelBase
{
    private INavigationService _navigationService;
    public GameViewModel(INavigationService NavigationService)
    {
        _navigationService = NavigationService;
    }

    // Then, when you want to expose a navigation command:
    private RelayCommand _navigateToMenuCommand;
    public RelayCommand NavigateToMenuCommand
    {
        get
        {
            return _navigateToMenuCommand
                ?? (_navigateToMenuCommand = new RelayCommand(
                () =>
                {
                    _navigationService.NavigateTo("MainMenu");
                }
        {
    }
}

および .XAML:

<Button Content="Back to Main Menu" Command={Binding GameViewModel} />
于 2016-01-07T12:05:36.660 に答える