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
导航窗体
-
创建一个window窗体
-
把
<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>
-
把.cs 中的类继承改为 :NavigationWindow
public partial class MainWindow : NavigationWindow
-
在 xaml 中设置点鼠标击事件
-
在 .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() | 方法 | 重新加载当前页 |