首页 > 其他分享 >WPF中实现页面跳转

WPF中实现页面跳转

时间:2023-12-27 14:35:49浏览次数:25  
标签:控件 NavigationService frame 跳转 WPF Page1 页面

`

WPF中实现页面跳转


WPF是Windows Presentation Foundation的缩写,是微软推出的一种用于创建桌面应用程序的技术。WPF中有一个重要的概念就是页面(Page),它可以让我们在一个窗口(Window)中显示不同的内容,实现类似于网页浏览器的效果。页面跳转就是指从一个页面切换到另一个页面的过程。在本文中,我们将介绍WPF中实现页面跳转的几种常用方法。


方法一:使用Frame控件


Frame控件是一个可以显示其他内容的容器控件,它可以加载页面、文档或者用户控件(UserControl)。我们可以在窗口中放置一个Frame控件,然后通过设置它的Source属性来指定要显示的页面的地址。例如,如果我们有两个页面Page1.xaml和Page2.xaml,我们可以在窗口中添加如下代码:


<Window x:Class="WpfApp1.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="MainWindow" Height="450" Width="800">

    <Grid>

        <Frame x:Name="frame" />

    </Grid>

</Window>


然后在窗口的代码后台中,我们可以通过如下代码来实现页面跳转:


//跳转到Page1

frame.Source = new Uri("Page1.xaml", UriKind.Relative);


//跳转到Page2

frame.Source = new Uri("Page2.xaml", UriKind.Relative);


这种方法比较简单,但是有一个缺点,就是每次跳转都会重新创建一个新的页面对象,这会消耗更多的资源,并且无法保留页面之间的状态。


方法二:使用NavigationService类


NavigationService类是一个提供导航功能的类,它可以在窗口或者Frame控件中使用。我们可以通过调用它的Navigate方法来实现页面跳转,并且可以传递一些参数给目标页面。例如,如果我们想要在跳转到Page2时传递一个字符串参数"Hello",我们可以在窗口中添加如下代码:

<Window x:Class="WpfApp1.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="MainWindow" Height="450" Width="800">

    <Grid>

        <Frame x:Name="frame" />

    </Grid>

</Window>


然后在窗口的代码后台中,我们可以通过如下代码来实现页面跳转:


//跳转到Page1

frame.NavigationService.Navigate(new Page1());


//跳转到Page2,并传递参数

frame.NavigationService.Navigate(new Page2(), "Hello");


这种方法的优点是可以传递参数,并且可以利用导航历史来实现前进和后退的功能。但是它也有一个缺点,就是每次跳转仍然会重新创建一个新的页面对象。


方法三:使用PageFunction类


PageFunction类是一种特殊的页面,它可以实现类似于对话框的功能,即在跳转到另一个页面时暂停当前页面,并且在返回时恢复当前页面的状态。我们可以通过继承PageFunction类来创建自定义的PageFunction,并且可以通过设置它的KeepAlive属性来决定是否保留页面对象。例如,如果我们有一个名为MyPageFunction的自定义PageFunction,并且想要在跳转到它时暂停当前页面,并且在返回时恢复当前页面的状态,我们可以在窗口中添加如下代码:

<Window x:Class="WpfApp1.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:local="clr-namespace:WpfApp1"

        Title="MainWindow" Height="450" Width="800">

    <Grid>

        <Frame x:Name="frame" />

    </Grid>

</Window>


然后在窗口的代码后台中,我们可以通过如下代码来实现页面跳转:


//跳转到Page1

frame.NavigationService.Navigate(new Page1());


//跳转到MyPageFunction,并暂停当前页面

MyPageFunction mpf = new MyPageFunction();

mpf.KeepAlive = true; //保留页面对象

mpf.Return += Mpf_Return; //注册返回事件

frame.NavigationService.Navigate(mpf);


//处理返回事件

private void Mpf_Return(object sender, ReturnEventArgs<string> e)

{

    //获取返回值

    string result = e.Result;

    //恢复当前页面的状态

}

这种方法的优点是可以实现页面之间的状态保存,并且可以获取返回值。但是它也有一个缺点,就是需要创建自定义的PageFunction类,并且需要注册返回事件。

标签:控件,NavigationService,frame,跳转,WPF,Page1,页面
From: https://blog.51cto.com/u_16477312/8999562

相关文章

  • WPF学习路线
    WPF是WindowsPresentationFoundation的缩写,是微软推出的一种用于创建桌面应用程序的技术。WPF基于.NETFramework,使用XAML作为界面描述语言,支持数据绑定、动画、样式、模板等功能。WPF可以创建出丰富而美观的用户界面,提高用户体验和开发效率。如果你想学习WPF,那么你需要掌握以下......
  • vite+vue3 打包后页面空白现象
    使用vite打包之后运行index.html空白,打开控制台发现报错:解决方法:在vite.config中加入:publicPath:'./',这是vite.config中的结构: exportdefaultdefineConfig({publicPath:'./',lintOnSave:false,transpileDependencies:true,plugins:[......
  • debug跳转至 var4.getTargetException()
    今天敲了一个插入表的业务逻辑,发现控制台没有报错,但方法却没有执行完毕,debug后发现程序跳转到了该异常。经过上网搜索后有所了解,出现该异常的根本原因是当使用反射调用方法时,如果被调用的方法抛出了异常,而调用的方法却没有捕捉处理,那么该异常会被封装在一个`InvocationTargetEx......
  • React 页面崩溃问题
    今天遇到一个页面崩溃问题,很神奇的是初始化打开的时候会崩溃,但是切到其他内容,再切回来又好了因为React是prod的版本,所以报错其实没卵用,最后定位到这个代码上:尝试了下,一个组件,returnnull或者returnfalse都是work的,但是returnundefined就不行了,而上图中前者可能会......
  • WebView中的页面调试方法
    在iOS12中,苹果正式弃用UIWebView,改成WKWebView,参考官方声明。后者在性能、稳定性、功能方面有很大提升,并且与Safari具有相同的JavaScript引擎(JavaScriptCore)。从Android4.4开始,增加ChromiumWebView,用来取代AndroidWebKitWebView。从Android......
  • 用DevExpress WPF Windows 10 UI组件,轻松构建触摸优先的业务型应用UX(上)
    DevExpressWPF的Windows10UI组件包含了一系列应用导航组件、Toast通知、对话框组件等,能帮助用户轻松开发漂亮的业务型应用程序,并模仿触摸优先的Windows10ProUX。P.S:DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress......
  • 如何从Word中的整个文档中选择页面范围?
    转自:如何从Word中的整个文档中选择页面范围?如果要在Word文档中选择任何页面范围,可以用几种方法完成它?现在,我介绍一些技巧,供您选择MicrosoftWord中的页面范围。按住Shift键并在Word中选择页面范围使用VBA选择页面范围选择一系列页面KutoolsforWord 按住Shift键并在Word......
  • nginx部署vue编译项目刷新页面404
    原因:nginx配置错误。因为vue打包输出的是单页网页应用,只有一个index.html入口,其他路径是由前端路由去跳转的,服务器目录下没有对应物理路径,所以就会报404。这样的nginx配置会出现该问题。location/{alias/home/vue/dist/;indexindex.html;}  解......
  • WPF 图片围绕中心点旋转
    <Image.RenderTransform></Image.RenderTransform><Image.Triggers></Image.Triggers><Image.Source><DrawingImage><DrawingImage.Drawing><DrawingGroup>......
  • 基于Python-Windows环境的Excel页面截图并邮件正文发送
    截图模块#截图模块defget_snapshot():#定义变量#excel文件的绝对位置excel_file=r'E:\L.xlsx'#输出图片的绝对位置output_png_path=r'E:\L.png'#excel的sheet名称excel_tb='每日销售'#注意要装excel软件,否则会报错excel=win......