C#WPF如何跳转页面

1. 创建导航窗口(NavigationWindow)

NavigationWindow 是专门用于页面导航的窗口,自带导航按钮(前进 / 后退)。

步骤 1:新建 NavigationWindow

在项目中添加一个NavigationWindow(如MainNavWindow.xaml):

复制代码
<!-- MainNavWindow.xaml -->
<NavigationWindow x:Class="WpfApp.MainNavWindow"
                  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                  Title="导航窗口" Width="800" Height="600"
                  Source="Page1.xaml"> <!-- 设置初始页面 -->
</NavigationWindow>

步骤 2:设置启动窗口

App.xaml中指定启动窗口为MainNavWindow

复制代码
<Application x:Class="WpfApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainNavWindow.xaml"> <!-- 改为导航窗口 -->
</Application>
2. 创建 Page 页面

新建多个Page(如Page1.xamlPage2.xaml)作为跳转目标:

Page1.xaml(包含跳转到 Page2 的按钮):

复制代码
<Page x:Class="WpfApp.Page1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="Page1">
    <StackPanel>
        <TextBlock FontSize="20" Text="这是页面1"/>
        <Button Content="跳转到页面2" Click="GoToPage2"/>
    </StackPanel>
</Page>

Page1.xaml.cs(实现跳转逻辑):

复制代码
private void GoToPage2(object sender, RoutedEventArgs e) {
    // 跳转到Page2
    this.NavigationService.Navigate(new Page2());
}
3. 常用导航操作
  • 返回上一页:

    复制代码
    if (this.NavigationService.CanGoBack) {
        this.NavigationService.GoBack(); // 后退
    }
  • 前进到下一页:

    复制代码
    if (this.NavigationService.CanGoForward) {
        this.NavigationService.GoForward(); // 前进
    }
  • 刷新当前页:

    复制代码
    this.NavigationService.Refresh();

二、在 Window 中切换 UserControl(适合单窗口应用)

如果不需要导航历史,可在Window中通过切换UserControl实现 "页面" 切换,更灵活。

1. 创建 UserControl(模拟页面)

新建两个UserControl(如UC_Home.xamlUC_Settings.xaml):

UC_Home.xaml

复制代码
<UserControl x:Class="WpfApp.UC_Home"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <TextBlock FontSize="20" Text="这是首页"/>
</UserControl>

UC_Settings.xaml

复制代码
<UserControl x:Class="WpfApp.UC_Settings"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <TextBlock FontSize="20" Text="这是设置页"/>
</UserControl>
2. 在 Window 中切换 UserControl

在主窗口中用一个容器(如Grid)承载UserControl,通过代码动态切换:

MainWindow.xaml

复制代码
<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="切换页面示例" Width="800" Height="600">
    <Grid>
        <!-- 导航按钮 -->
        <StackPanel Orientation="Horizontal" Margin="10">
            <Button Content="首页" Click="ShowHome" Margin="5"/>
            <Button Content="设置" Click="ShowSettings" Margin="5"/>
        </StackPanel>
        
        <!-- 页面容器(用于显示UserControl) -->
        <Grid x:Name="ContentContainer" Margin="10,50,10,10"/>
    </Grid>
</Window>

MainWindow.xaml.cs(切换逻辑):

复制代码
private void ShowHome(object sender, RoutedEventArgs e) {
    // 清空容器,添加首页UserControl
    ContentContainer.Children.Clear();
    ContentContainer.Children.Add(new UC_Home());
}
​
private void ShowSettings(object sender, RoutedEventArgs e) {
    // 清空容器,添加设置页UserControl
    ContentContainer.Children.Clear();
    ContentContainer.Children.Add(new UC_Settings());
}

三、两种方式的对比

方式 优点 缺点 适用场景
NavigationWindow+Page 自带导航历史(前进 / 后退) 导航栏样式固定,定制性差 类似浏览器的多页面导航
Window+UserControl 完全自定义布局,灵活度高 需手动实现导航历史(如需要) 单窗口应用,如管理系统界面

根据需求选择合适的方式,小型应用推荐用Window+UserControl,需要完整导航功能时用NavigationWindow+Page

相关推荐
love530love20 小时前
【笔记】AutoClaw NSIS 安装器卡死、进程杀不掉、目录删不了?我是这么解决的
人工智能·windows·笔记·agent
谙弆悕博士1 天前
系统集成项目管理工程师教程(第3版)笔记——第2章:信息技术发展
笔记·计算机网络·信息安全·学习方法·业界资讯·软考·系统分析师
吃着火锅x唱着歌1 天前
Effective C++ 学习笔记 条款37 绝不重新定义继承而来的缺省参数值
c++·笔记·学习
风曦Kisaki1 天前
# Linux笔记:操作系统优化与资源管理
linux·运维·服务器·笔记
阿米亚波1 天前
【C++】流式数据输入处理(不完全整理)
开发语言·c++·笔记
zhangrelay1 天前
笔记本轻量高品质延寿工具完整分系统清单
运维·笔记·学习
巴巴媛6661 天前
STM32学习笔记【38.DHT11实验】
笔记·stm32·学习
caimouse1 天前
MM 学习笔记 01:miarm.h 核心头文件分析
笔记·学习·reactos
疯狂打码的少年1 天前
【软件工程】软件测试阶段:单元测试与集成测试(高频对比考点)
笔记·单元测试·集成测试·软件工程