WPF 导航

WPF 导航相关控件/机制

控件 / 类说明常用属性/方法
Frame用来承载不同的页面 (Page) 并在它们之间切换的容器。Source(导航到的 URI) Navigate()(导航方法) CanGoBack / GoBack() CanGoForward / GoForward()
Page表示一个单独的可导航页面(可以像网页那样切换)。NavigationService(访问导航服务)
NavigationWindow自带导航栏的窗口,可以在多个页面(Page)间导航。Source(启动时加载的页面) ShowsNavigationUI(是否显示导航栏)
NavigationService后台管理 Frame 或 Page 导航动作的类。Navigate() GoBack() GoForward() RemoveBackEntry()

常见场景示例

一、使用 Frame 控件

1. 使用 Frame 导航到一个 Page

MainWindow.xaml 中添加一个 Frame:

 <Window x:Class="WpfApp.MainWindow"
         ...>
   <Grid>
     <Frame x:Name="MainFrame" NavigationUIVisibility="Hidden" />
     <Button Content="跳转" Click="Button_Click" HorizontalAlignment="Right" VerticalAlignment="Top"/>
   </Grid>
 </Window>

MainWindow.xaml.cs 后台跳转页面:

 private void Button_Click(object sender, RoutedEventArgs e)
 {
     MainFrame.Navigate(new Uri("Page1.xaml", UriKind.Relative));
 }

2. Page 内部也可以继续导航

比如在 Page1.xaml

 <Grid>
     <Button Content="Page2" Click="GoToPage2_Click"/>
 </Grid>

Page1.xaml.cs

 private void GoToPage2_Click(object sender, RoutedEventArgs e)
 {
     NavigationService.Navigate(new Uri("Page2.xaml", UriKind.Relative));
 }

补充属性

  • NavigationUIVisibility="Hidden":隐藏 Frame 自带的导航栏。

  • JournalOwnership="OwnsJournal":让 Frame 记录自己的导航历史。

  • KeepAlive="True":Page 保持实例,不每次都重新加载(否则每次跳回来都会重新创建)。

二、使用 NavigationWindw导航窗体

  1. 创建一个window窗体

  2. <window> 改为<NavigationWindw >

    <!--  NavigationWindow窗体当成其他Page页面的容器。  -->
    <!--  Source=""当前容器中应该放置哪个Page页面  -->
    <NavigationWindow
        x:Class="导航窗体.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"
        Title="MainWindow"
        Source="/Pages/MainPage.xaml"
        mc:Ignorable="d"/>
    </NavigationWindow>
  3. 把.cs 中的类继承改为 :NavigationWindow

    public partial class MainWindow : NavigationWindow
  4. 在 xaml 中设置点鼠标击事件

  5. 在 .cs 中设置事件

    private void TextBlock MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
      // 跳转到新页面
      this.NavigationService.Navigate(new Uri("完整的路径");
      //this.NavigationService.Navigate(new Uri(new page1);
      //this.NavigationService.Navigate(new Uri("相对路径", UriKind.Relative));
    }

UriKind :是一个枚举,它定义了如何解释 URI 字符串:

  • UriKind.Absolute:指定 URI 是一个绝对路径(完整的路径)。

  • UriKind.Relative:指定 URI 是一个相对路径(相对于当前位置)。

  • UriKind.RelativeOrAbsolute:指定 URI 可以是绝对路径或相对路径。使用这种类型,.NET 会根据输入字符串来判断 URI 是绝对的还是相对的。

C# NavigationService 属性:

成员类型作用
CanGoBackbool是否可以返回上一页(是否有返回历史)。
CanGoForwardbool是否可以前进到下一页。
CurrentSourceUri获取当前页面的地址。
BackStackIEnumerable返回历史的集合(栈)。
ForwardStackIEnumerable前进历史的集合(栈)
Navigate(Uri uri)方法导航到指定 URI 的页面。
Navigate(Object content)方法导航到指定的 Page 对象。
GoBack()方法回到上一页。
GoForward()方法前进到下一页。
RemoveBackEntry()方法删除上一页的历史记录。
Refresh()方法重新加载当前页
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值