当前位置: 首页 > news >正文

微软UWP应用,导航栏设计。

实现两个页面之间的导航

重要的 APIWindows.UI.Xaml.Controls.Frame 类, Windows.UI.Xaml.Controls.PageWindows.UI.Xaml.Navigation命名空间

在C#的通用桌面应用中加入2个空白页面:Page1,Page2.

<Grid>
        <TextBlock x:Name="pageTitle" Text="Page1" />
        <StackPanel>
            <TextBlock HorizontalAlignment="Center" Text="Enter your name"/>
            <TextBox HorizontalAlignment="Center" Width="200" Name="name"/>
            <HyperlinkButton Content="Click to go to page 2" 
                     Click="HyperlinkButton_Click"
                     HorizontalAlignment="Center" RenderTransformOrigin="0.475,3.859" VerticalAlignment="Center"/>
        </StackPanel>
 </Grid>

在Page1.xaml中加入HyperlinkButton元素,添加Click事件转至Page2。

<Grid>
        <TextBlock x:Name="pageTitle" Text="Page2" />
        <StackPanel>
            <TextBlock HorizontalAlignment="Center" Name="greeting"/>
            <HyperlinkButton Content="Click to go to page 1" 
                     Click="HyperlinkButton_Click"
                     HorizontalAlignment="Center"/>
        </StackPanel>
        <Button x:Name="BackButton" VerticalAlignment="Top" HorizontalAlignment="Left" Click="Back_Click" Style="{StaticResource NavigationBackButtonNormalStyle}"/>
 </Grid>
public sealed partial class Page1 : Page
    {
        public Page1()
        {
            this.InitializeComponent();
            this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
        }

        private void HyperlinkButton_Click(object sender, RoutedEventArgs e)
        {
            this.Frame.Navigate(typeof(Page2), name.Text);
        }
    }
 public sealed partial class Page2 : Page
    {
        public Page2()
        {
            this.InitializeComponent();
        }

        private void HyperlinkButton_Click(object sender, RoutedEventArgs e)
        {
            this.Frame.Navigate(typeof(Page1));
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            BackButton.IsEnabled = this.Frame.CanGoBack;
            if (e.Parameter is string && !string.IsNullOrWhiteSpace((string)e.Parameter))
            {
                greeting.Text = $"Hi, {e.Parameter.ToString()}";
            }
            else
            {
                greeting.Text = "Hi!";
            }
            base.OnNavigatedTo(e);
        }

        private void Back_Click(object sender, RoutedEventArgs e)
        {
            On_BackRequested();
        }

        // Handles system-level BackRequested events and page-level back button Click events
        private bool On_BackRequested()
        {
            if (this.Frame.CanGoBack)
            {
                this.Frame.GoBack();
                return true;
            }
            return false;
        }

        private void BackInvoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args)
        {
            On_BackRequested();
            args.Handled = true;
        }
    }

App.xaml.cs代码如下:

sealed partial class App : Application
    {
        /// <summary>
        /// 初始化单一实例应用程序对象。这是执行的创作代码的第一行,
        /// 已执行,逻辑上等同于 main() 或 WinMain()。
        /// </summary>
        public App()
        {
            this.InitializeComponent();
            this.Suspending += OnSuspending;
        }
       
        /// <summary>
        /// 在应用程序由最终用户正常启动时进行调用。
        /// 将在启动应用程序以打开特定文件等情况下使用。
        /// </summary>
        /// <param name="e">有关启动请求和过程的详细信息。</param>
        protected override void OnLaunched(LaunchActivatedEventArgs e)
        {
            Frame rootFrame = Window.Current.Content as Frame;

            // 不要在窗口已包含内容时重复应用程序初始化,
            // 只需确保窗口处于活动状态
            if (rootFrame == null)
            {
                // 创建要充当导航上下文的框架,并导航到第一页
                rootFrame = new Frame();

                rootFrame.NavigationFailed += OnNavigationFailed;

                if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    //TODO: 从之前挂起的应用程序加载状态
                }

                // 将框架放在当前窗口中
                Window.Current.Content = rootFrame;
            }

            if (e.PrelaunchActivated == false)
            {
                if (rootFrame.Content == null)
                {
                    // 当导航堆栈尚未还原时,导航到第一页,
                    // 并通过将所需信息作为导航参数传入来配置
                    // 参数
                    rootFrame.Navigate(typeof(Page1), e.Arguments);
                }
                // 确保当前窗口处于活动状态
                Window.Current.Activate();
            }
        }

        /// <summary>
        /// 导航到特定页失败时调用
        /// </summary>
        ///<param name="sender">导航失败的框架</param>
        ///<param name="e">有关导航失败的详细信息</param>
        void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
        }

        /// <summary>
        /// 在将要挂起应用程序执行时调用。  在不知道应用程序
        /// 无需知道应用程序会被终止还是会恢复,
        /// 并让内存内容保持不变。
        /// </summary>
        /// <param name="sender">挂起的请求的源。</param>
        /// <param name="e">有关挂起请求的详细信息。</param>
        private void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();
            //TODO: 保存应用程序状态并停止任何后台活动
            deferral.Complete();
        }
    }

运行结果:

 

转载于:https://www.cnblogs.com/dddyg/p/10801210.html

相关文章:

  • Python 之继承
  • 写给我即将出生小孩的第一封信
  • Centos6.5安装Redis3.2.8
  • SSH connect issue 'exec request failed on channel 0'
  • SQL0668N Operation not allowed for reason code 3 on table TEST. SQLSTATE=57016
  • 作用域插槽slot
  • nodejs模块
  • 智能制造主战场在哪?数字化车间建设尤为重要
  • 快速排序(java实现)
  • 十天冲刺(6)
  • HashMap和HashTable的区别?HashTable和ConCurrentHashMap的区别?
  • 小笔记by项目遇到(整理)
  • 2019年5月9日考试解题报告
  • 银联基于OpenStack 的“五高”生产金融云技术白皮书
  • 通过shell终端上传下载文件
  • JavaScript-如何实现克隆(clone)函数
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Android 控件背景颜色处理
  • Android开源项目规范总结
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Mysql优化
  • spark本地环境的搭建到运行第一个spark程序
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 机器学习中为什么要做归一化normalization
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端之Sass/Scss实战笔记
  • 区块链将重新定义世界
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 我这样减少了26.5M Java内存!
  • 小程序测试方案初探
  • 应用生命周期终极 DevOps 工具包
  • 用Python写一份独特的元宵节祝福
  • const的用法,特别是用在函数前面与后面的区别
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #define与typedef区别
  • %check_box% in rails :coditions={:has_many , :through}
  • (14)Hive调优——合并小文件
  • (23)Linux的软硬连接
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (第二周)效能测试
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (转)EOS中账户、钱包和密钥的关系
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转载)Linux网络编程入门
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net 调用php,php 调用.net com组件 --
  • .net 托管代码与非托管代码