一:介绍
Frame 控件是一个非常重要的元素,主要用于实现页面导航和内容的动态加载。Frame 类似于网页开发中的iframe,但它是WPF应用程序中的一个容器,能够显示不同的页面或控件内容。
二:使用
- Source :承载页面的网址,也可以是自己项目里的页面。
- NavigationUIVisibility : 显示出一个自动记录前进后退导航的UI。
-
LoadCompleted :页面加载完成之后的事件 根据对应的函数用来验证页面是否加载完成。
例如:
<Frame Name="mainFrame" Width="800" Height="600"
Source="../Page1.xaml"
NavigationUIVisibility="Visible"
LoadCompleted="mainFrame_LoadCompleted">
</Frame>
- Content,可以用来获取或设置Frame中当前显示的内容。这可以是任何WPF控件或者页面。
// 查看content
private void Button_Click_1(object sender, RoutedEventArgs e)
{
var c = this.mainFrame.Content;
if (c != null)
{
MessageBox.Show(c.GetType().ToString());
}
}
三:页面跳转和导航
- 使用Source跳转:
// 点击跳转
private void Button_Click(object sender, RoutedEventArgs e)
{
// Source
this.mainFrame.Source = new Uri(@"../Page2.xaml", UriKind.Relative);
}
- 使用Navigate跳转:
// 点击跳转
private void Button_Click(object sender, RoutedEventArgs e)
{
// Navigate方式
//this.mainFrame.Navigate(new Uri(@"../Page2.xaml", UriKind.Relative));
//Navigate方式传参
this.mainFrame.Navigate(new Uri(@"../Page2.xaml", UriKind.Relative), "param");
}
// 页面加载完成之后的事件
private void mainFrame_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
object e1 = e.ExtraData;
if (e1 != null)
{
MessageBox.Show("页面加载完毕:" + e1.ToString());
}
}
-
导航功能:
Frame控件维护了一个导航堆栈,这意味着你可以使用GoBack和GoForward方法来实现后退和前进功能。
private void Button_Click_2(object sender, RoutedEventArgs e)
{
this.mainFrame.GoBack();
}
private void Button_Click_3(object sender, RoutedEventArgs e)
{
this.mainFrame.GoForward();
}
必须保证mainFrame中至少加载两个界面才能用,否则会崩溃
如果设置了Frame的NavigationUIVisibility为Visible,也可以点击导航按钮来切换page
-
导航事件:
Frame提供了多个事件,如Navigated、Navigating、NavigationFailed和NavigationStopped,这些事件允许你对导航过程中的不同阶段做出响应。 -
导航服务:
页面可以通过INavigationService接口访问Frame的导航功能,从而在代码中控制导航。
//this.mainFrame.NavigationService.GoBack();
//this.mainFrame.NavigationService.GoForward();
//this.mainFrame.NavigationService.Navigate(new Uri(@"../Page2.xaml", UriKind.Relative));
可参考一下NavigationWindow
Source和Navigate区别
- 参数传递: Navigate 方法支持参数传递给页面的构造函数或OnNavigatedTo方法,而Source属性不支持参数传递。
- MVVM兼容性: Navigate 方法更符合MVVM设计模式,而Source属性的使用则偏离了这种模式。
- 灵活性: Navigate 方法提供了更多的灵活性和控制,包括对导航模式和状态管理的支持,而Source属性相对简单和直接。