WPF page 在点击鼠标侧键,会出现回到上一页,下一页的情况

参考:WPF之导航和Page的生命周期 - wangyafei_it - 博客园

page页切换页时会保留导航记录,在点击鼠标侧键,会出现回到上一页,下一页的情况,但有时我们不需要这种情况,所以需要清除导航记录,

若是用下图的方法清除,会出现导航记录中始终有上一个页面的记录,因为这个方法执行完之后页面才能生成,导航记录里只有上上个页面的,比如有page1,page2两个页面,现在处在page1页面,导航记录为空,在下面的代码里执行到清除导航记录时,此时的导航记录为空,因为这个方法还没走完,page2还没生成,理论上来说还是处在page1页面里。当page2生成后,点击鼠标的侧键还是会回到page1页面。

 if (i == 2)
 {
     frame.Content = new Page1(this);
 }
 else if (i == 3)
 {
     frame.Content = new Page2(this);
 }
 i--;
 if (!frame.CanGoBack && !frame.CanGoForward)
 {
     // do nothing    
 }
 else
 {
     // clear frame history
     var entry = frame.RemoveBackEntry();
     while (entry != null)
     {
         entry = frame.RemoveBackEntry();
     }
 }

解决办法:在page的UnLoaded页面里清除父容器的导航记录。

xaml:
<Page x:Class="WpfApp1.Page1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:WpfApp1"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      Title="Page1" Unloaded="Page_Unloaded">
    <Grid Background="Azure">
        <Label>page1</Label>
    </Grid>
</Page>

cs:
 WeakReference<MainWindow> main;  //弱引用父窗口
 public Page1(MainWindow window)
 {
     main = new WeakReference<MainWindow>(window); 
     System.Console.WriteLine("------------------------------------------");
     System.Console.WriteLine("Page1 被创建出来");

     InitializeComponent();
 }
 private void Page_Unloaded(object sender, RoutedEventArgs e)
 {
     if(main.TryGetTarget(out MainWindow target))
     {
         if (target != null)
         {
             var entry = target.frame.RemoveBackEntry();  //清除父容器的导航记录
             while (entry != null)
             {
                 entry = target.frame.RemoveBackEntry();
             }
         }
     }
     System.Console.WriteLine("------------------------------------------");
     System.Console.WriteLine("Page1 UnLoaded");

 }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值