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頁面 --> <NavigationWindowx: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() | 方法 | 重新加載當前頁 |