参考地址:https://www.cnblogs.com/Jaasdsa/p/6164200.html
前台:
<Window>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<WrapPanel VerticalAlignment="Center">
<Button Tag="PageA" Name="btnA" Height="30" Width="60" Margin="5" Click="btnNav_Click">页面A</Button>
<Button Tag="PageB" Name="btnB" Height="30" Width="60" Click="btnNav_Click">页面B</Button>
</WrapPanel>
<Frame Name="frmMain" NavigationUIVisibility="Hidden"></Frame>
</Grid>
</Window>
后台按钮事件:
private void btnNav_Click(object sender, RoutedEventArgs e)
{
Button btn = sender as Button;
this.frmMain.Navigate(new Uri(btn.Tag.ToString()+".xaml",UriKind.Relative));
}
这样无论添加多少页面,不需要修改后台方法,只需为导航按钮添加相应的Tag就可以了。(使用Name属性或其他属性也是可以的,有兴趣的可以自己试试)
3.互相调用的Window和Page
在复杂一点的WPF程序里,我们往往不仅需要页面间切换浏览,有时也需要相互调用方法,比如说在PageA中调用MainWindow的方法,代码如下:
在MainWindow.xaml.cs中有一个公共方法:
1 public void CallFromChild(string name) 2 { 3 MessageBox.Show("Hello," + name + "!"); 4 }
在PageA.xam.cs中为其添加一个属性,使其在实例化后能访问MainWindow。
1 private MainWindow _parentWin; 2 public MainWindow ParentWindow 3 { 4 get { return _parentWin; } 5 set { _parentWin = value; } 6 }
当页面切换到PageAxaml,即PageA实例化后,使得ParentWindow=MainWindow;
1 private void btnA_Click(object sender, RoutedEventArgs e) 2 { 3 PageA a = new PageA(); 4 this.frmMain.Content = a; 5 a.ParentWindow = this; 6 }
注意这里页面导航的方法由this.frmMain.Navigate换成了this.frmMain.Content。然后在PageA就可以添加方法来调用MainWindow中的CallFromChild()方法了。
1 private void btnCall_Click(object sender, RoutedEventArgs e) 2 { 3 ParentWindow.CallFromChild("PageA"); 4 }