在某些条件下重定向到WPF中的其他页面

时间:2018-04-30 08:38:40

标签: c# wpf

您好我正在制作WPF应用程序。

我有一个主窗口,我有导航,然后我也有一个堆叠面板,用这个:

<Frame x:Name="_mainFrame" NavigationUIVisibility="Hidden"/>

里面,我把我的页面放在里面。

在我的主窗口中,我使用以下内容导航到其他页面,例如移动到gameWindow:

private void NavigateGameWindow(object sender, RoutedEventArgs e)
        {
            _mainFrame.Navigate(new GameWindow());
        }

这很好用,但现在我在那个窗口(gameWindow)里面,我正在检查一个&#34;播放器&#34;设置,如果没有,我想导航到另一个页面,我可以在其中设置某些值。 然后导航回GameWindow。

但是当它是主窗口的一部分时,如何获得_mainFrame呢?

它在_mainFrame

中的GameWindow中说
The name _mainFrame, does not exist in the current context

游戏窗口

public partial class GameWindow 
{
    private int numberOfPlayers;
    private Player[] players;

    private INavigator _navigator;

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

主窗口

 public partial class MainWindow : Window, 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 GameRulesWindow());
    }

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

GameSettings

 public partial class GameSettings : Page
{
    public GameSettings()
    {
        InitializeComponent();

        //var gameProps = new GameProperties();

        // set number of players,, should prompt user, and get value!
        //gameProps.SetNumberOfPlayers(2);
    }
}

查看游戏设置

<Page x:Class="ITD.OOP_Projekt.WPF.Menu.GameSettings"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:ITD.OOP_Projekt.WPF.Menu"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      Title="GameSettings">

    <Grid Background="white">
        <TextBox HorizontalAlignment="Left" Height="23" Margin="229,144,0,0" TextWrapping="Wrap" Text="This is game settings" VerticalAlignment="Top" Width="120"/>
    </Grid>
</Page>

1 个答案:

答案 0 :(得分:2)

一个非常简单的解决方案是:

因此,使用以下代码,您只有一个窗口(主窗口),并在该窗口中显示您的页面。您可以将其与互联网浏览器进行比较。您有一个窗口,在该窗口内,您可以在页面之间导航(设置,游戏,高分,......)。 我希望这有帮助,你可以让它工作! 如果没有,我可以尝试在晚上上传一个简单的例子到github。 只需摆脱你的GameWindow并将其作为一个页面实现。

<强>主窗口

XAML:

<Window x:Class="PageSwitcher.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:PageSwitcher"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>

  <Frame x:Name="MainFrame" NavigationUIVisibility="Hidden" />

</Grid>

CS:

public partial class MainWindow : INavigator
{
    public MainWindow()
    {
        InitializeComponent();
        Navigate( new Page1(this) );
    }

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

<强>第1页

XAML:

<Page x:Class="PageSwitcher.Page1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  xmlns:local="clr-namespace:PageSwitcher"
  mc:Ignorable="d" 
  d:DesignHeight="450" d:DesignWidth="800"
  Title="Page1">

<Grid Background="Green">
  <Button Width="150" Height="30" Click="ButtonBase_OnClick" Content="Go to Page2" /> 
</Grid>

CS:

public partial class Page1 : Page
{

    private INavigator _navigator;

    public Page1(INavigator navigator)
    {
        _navigator = navigator;
        InitializeComponent();
    }

    private void ButtonBase_OnClick( object sender, RoutedEventArgs e )
    {
        _navigator.Navigate(new Page2(_navigator));
    }
}

<强>第2页

XAML:

<Page x:Class="PageSwitcher.Page2"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  xmlns:local="clr-namespace:PageSwitcher"
  mc:Ignorable="d" 
  d:DesignHeight="450" d:DesignWidth="800"
  Title="Page2">

<Grid Background="Blue">
    <Button Width="150" Height="30" Click="ButtonBase_OnClick" Content="Go to Page1"/> 
</Grid>

CS:

public partial class Page2 : Page
{
    private INavigator _navigator;

    public Page2(INavigator navigator)
    {
        _navigator = navigator;
        InitializeComponent();
    }

    private void ButtonBase_OnClick( object sender, RoutedEventArgs e )
    {
        _navigator.Navigate(new Page1(_navigator  ));
    }
}

这就是你真正需要的一切。 在此示例中,您可以在按钮单击事件上切换两个页面。 只需启动一个新的wpf项目并复制代码。 玩弄它直到你理解它,然后尝试在你的游戏中实现它:)