2015-11-02 182 views
0

我正在制作Pacman Windows应用商店应用游戏。我使用win2d库来制作动画。我在页面之间导航时遇到问题。 这是我的主页,它创建了新的游戏。Windows商店应用导航

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(); 
} 

我该如何浏览页面?谢谢。

回答

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(); 
     } 
    } 
} 

你使用这样的(如果我们假设上述方法存在于一个名为类你有实例导航):

//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(); 

加成

你可以收到通过看齐ameters在你的看法是这样的:

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

来传递数据的其他选择是在你的应用程序

0

我创建一个静态或单应用的明智类包含您要使用一些值(从随处可见)建议您考虑模型视图视图模型模式来管理您的应用的导航逻辑和内容。 (Channel9 introductive video)

为了帮助你导航,你可以使用MVVM Light library暴露出一些有用的导航方法:

在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>(); 
} 

一典型的视图模型可能是:

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} />