首页 > 解决方案 > WPF 页面不显示内容

问题描述

我有一个 WPF 应用程序,如果不满足某些条件,我会在其中构建重定向。它似乎正确重定向,但它不显示 Xaml 文件的内容..

它从我的 GamePage 重定向到 GameSettingsPage。

主窗口作为主视图工作,我将页面放置在堆栈面板内的框架(_mainframe)内,因此我可以在不完全离开主窗口的情况下切换内容。

希望这是有道理的,因为几个小时后,我还没有找到为什么它不会显示游戏设置页面的问题......

我的代码:

主窗口

public partial class MainWindow : INavigator
{


    public MainWindow()
    {
        InitializeComponent();
    }

    private void ExitGame(object sender, RoutedEventArgs e)
    {
        System.Windows.Application.Current.Shutdown();
    }

    public void Navigate(Page p)
    {
        _mainFrame.Navigate(p);
    }

    private void NavigateRulesWindow(object sender, RoutedEventArgs e)
    {
        Navigate(new GameRulesPage());
    }

    private void NavigateGameWindow(object sender, RoutedEventArgs e)
    {
        Navigate(new GamePage(this));
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {

    }
}

游戏页面

public partial class GamePage : Page
{
    private int numberOfPlayers;
    private Player[] players;
    private int playerTurn = 0;
    private int diceThrow;
    private GameState state;
    private int delay = 500;
    private Dice dice = new Dice();
    private GameProperties _writeHelper;
    private GameRules _gameRules;

    private INavigator _navigator;

    public GamePage(INavigator navigator)
    {
        _navigator = navigator; //assign navigator so i can navigate _mainframe to other pages.

        // initialize game properties, check if they are set.
        var gameProp = new GameProperties();
        this.numberOfPlayers = 2;

        this.players = gameProp.CheckPlayerIsSet(this.players);
        //check if a player has been set
        if (this.players != null)
        { // Player is set or has been set. proceed or start the game.
            InitializeComponent();
        }
        else
        {   // redirect to settings window because players has not been set!
            _navigator.Navigate(new GameSettingsPage(_navigator));
        }
    }
}

游戏设置页面

public partial class GameSettingsPage : Page
{
    private INavigator _navigator;

    public GameSettingsPage(INavigator navigator)
    {
        InitializeComponent();
        _navigator = navigator; //assign navigator so i can navigate _mainframe to other pages.
    }
}

为了更好地衡量,我的界面

public interface INavigator
{
    void Navigate(Page p);
}

标签: c#wpf

解决方案


您必须查看执行顺序,尝试在Navigate(Page)方法中放置一个断点,然后您会看到发生了什么。

为了解释为什么什么都没有显示,让我们看看发生了什么。

  1. 您调用NavigateGameWindow()方法。

  2. 它开始构建GamePage对象。

  3. 条件进入 else 部分。

  4. GameSettingsPage被构造。

  5. _mainFrame.Navigate被调用并且_mainFrame导航到GameSettingsPage

  6. 线程继续执行,所以什么都不会显示。

  7. MainWindow.Navigate()返回完成的GamePage 构造函数

  8. 执行现在回到NavigateGameWindow中,它使用GamePage类型的对象再次调用MainWindow.Navigate() 。

  9. _mainFrame导航到GamePage对象。

什么都不显示(而不是GamePage )的原因是当条件不满足时,您没有在其构造函数中调用InitializeComponents() 。


推荐阅读