参考: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");
}
2138

被折叠的 条评论
为什么被折叠?



