UWP开发学习笔记1

导航到页面:

this.Frame.Navigate(typeof(SecondPage));

 


导航进入当前页面时会调用OnNavigatedTo方法;
导航从当前页面离开时会调用OnNavigatingFrom方法
导航时传递参数采用:

this.Frame.Navigate(typeof(SecondPage), "这里是参数");

 


接收页面获取参数:

复制代码
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if(e.Parameter!=null && e.Parameter is string)
    {
        tbkMessage.Text = e.Parameter as string;
    }

    base.OnNavigatedTo(e);
}
复制代码

 

管理导航记录
两个导航按钮:

<Page.BottomAppBar>
    <AppBar>
        <StackPanel Orientation="Horizontal">
            <AppBarButton Click="OnBack" Label="上一页" Icon="Back"/>
            <AppBarButton Click="OnForward" Label="下一页" Icon="Forward"/>
        </StackPanel>
    </AppBar>
</Page.BottomAppBar>

 


代码:

复制代码
private void OnBack(object sender, RoutedEventArgs e)
{
    if (this.Frame.CanGoBack)
    {
        this.Frame.GoBack();
    }
}

private void OnForward(object sender, RoutedEventArgs e)
{
    if (this.Frame.CanGoForward)
    {
        this.Frame.GoForward();
    }
    else
    {
        this.Frame.Navigate(typeof(PageA));
    }
}
复制代码

 

查看导航模式:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    tbkMessage.Text = "导航模式:" + e.NavigationMode.ToString();

    base.OnNavigatedTo(e);
}

 

从PageA跳转到PageB,然后又从PageB跳转到PageC,后面返回时不希望返回PageB,而是直接到PageA,可以在PageC的OnNavigatedTo方法加入以下代码:

复制代码
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    var page = this.Frame.BackStack.FirstOrDefault(p => p.SourcePageType == typeof(PageB));
    if (page != null)
    {
        Frame.BackStack.Remove(page);
    }
    base.OnNavigatedTo(e);
}
复制代码

 


处理手机上的“后退”键:
添加“Windows Mobile Extensions for the UWP”的引用
在App类的OnLaunched方法中加入以下代码:

if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons"))
{
    Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
}

 


然后添加HardwareButtons_BackPressed方法:

复制代码
private void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame != null)
    {
        if (rootFrame.CanGoBack)
        {
            e.Handled = true;
            rootFrame.GoBack();
        }
    }
}
复制代码

 


在App类的OnLaunched方法中添加以下代码:
rootFrame.CacheSize = 2;
表示缓存两个页面实例
然后在要缓存的页面的构造函数添加代码:

public SecondPage()
{
    this.InitializeComponent();
    this.NavigationCacheMode = NavigationCacheMode.Enabled;
}

 


NavigationCacheMode有三个值类型
Required:缓存页面,并且每次访问时都重复利用缓存的实例,而不考虑帧的缓存大小。
Enabled:缓存页面,但当超过帧的缓存大小时放弃缓存的实例。
Disabled:从不缓存页面,每次访问时创建页面的新实例。

保存和恢复导航状态
GetNavigationState:将 Frame 导航历史记录序列化为字符串。
SetNavigationState:从提供的序列化字符串中读取 Frame 的导航历史记录并还原。
在App类的OnSuspending方法中加入以下代码:

复制代码
private void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();

    Frame rootFrame = Window.Current.Content as Frame;
    string navstate = rootFrame.GetNavigationState();
    var localSettings = ApplicationData.Current.LocalSettings;
    localSettings.Values["nav"] = navstate;

    deferral.Complete();
}
复制代码

 

在OnLaunched方法中加入代码:

复制代码
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
    object value;
    var localSettings = ApplicationData.Current.LocalSettings;
    if (localSettings.Values.TryGetValue("nav", out value))
    {
        rootFrame.SetNavigationState(value as string);
    }
}
复制代码

 

posted @   wzwyc  阅读(418)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示