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:

XML 复制代码
 <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 后台跳转页面:

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

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

比如在 Page1.xaml

XML 复制代码
 <Grid>
     <Button Content="Page2" Click="GoToPage2_Click"/>
 </Grid>

Page1.xaml.cs

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 保持实例,不每次都重新加载(否则每次跳回来都会重新创建)。

  1. 创建一个window窗体

  2. <window> 改为<NavigationWindw >

    XML 复制代码
    <!--  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

    cs 复制代码
    public partial class MainWindow : NavigationWindow
  4. 在 xaml 中设置点鼠标击事件

  5. 在 .cs 中设置事件

    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 属性:

成员 类型 作用
CanGoBack bool 是否可以返回上一页(是否有返回历史)。
CanGoForward bool 是否可以前进到下一页。
CurrentSource Uri 获取当前页面的地址。
BackStack IEnumerable 返回历史的集合(栈)。
ForwardStack IEnumerable 前进历史的集合(栈)
Navigate(Uri uri) 方法 导航到指定 URI 的页面。
Navigate(Object content) 方法 导航到指定的 Page 对象。
GoBack() 方法 回到上一页。
GoForward() 方法 前进到下一页。
RemoveBackEntry() 方法 删除上一页的历史记录。
Refresh() 方法 重新加载当前页
相关推荐
Vae_Mars10 小时前
WPF中的ControlTemplate(控件模板)
wpf
SamChan9011 小时前
Python+ReportLab自动生成PDF翻译质量审计报告:从数据到可视化的完整方案
开发语言·python·ai·pdf·wpf
circuitsosk11 小时前
多智能体协同在能源数据分析中的实践:分配-执行-校验闭环架构设计
python·数据分析·wpf·能源·并行计算·多智能体系统·agent协作
weixin199701080161 天前
《大促护航:电商API限流与降级,双11峰值500万调用的架构复盘》(附Python源码)
python·架构·wpf
hh9502 天前
gent Plan x DeepSeek Harness:多 Agent 协作场景下的中央编排实践
人工智能·wpf·adg·火山引擎·agent plan·adg成都社区
Vae_Mars2 天前
WPF中的Lazy<T>使用方法
wpf
zQ.ii2 天前
WPF 触发器学习笔记
笔记·学习·wpf
SamChan902 天前
用PostgreSQL+pgvector构建PDF翻译记忆库:向量相似度检索+增量更新实战
数据库·python·ai·postgresql·pdf·wpf
李高钢3 天前
开源控件库 HandyControl 介绍与简单实践:让 WPF 界面告别“上个世纪“
开源·wpf
旋生万物4 天前
【终极实战】用Python从零“生成“一个宇宙:螺旋干涉模型的代码实现
开发语言·前端·人工智能·react.js·php·wpf