ApplicationBar(以下简称AppBar)是WP应用相当常见的控件,也很方便。常见的做法是pivot或者panorama的页面切换的时候,AppBar跟随切换对应的按钮或者不显示按钮,如下图。

这个方法比较简单,网上很容易找到资料,不过我还是简要的说一下。

首先要在页面资源里添加需要的AppBar,我这里添加了两个银色的AppBar。一个默认模式,一个最小化模式。

<phone:PhoneApplicationPage.Resources>
<shell:ApplicationBar x:Key="AppBar_1" BackgroundColor="Silver" Mode="Default" IsVisible="True">
<shell:ApplicationBarIconButton IconUri="/Assets/AppBar1/add.png" Text="添加"/>
<shell:ApplicationBarIconButton IconUri="/Assets/AppBar2/check.png" Text="确认"/>
</shell:ApplicationBar>
<shell:ApplicationBar x:Key="AppBar_2" BackgroundColor="Silver" IsMenuEnabled="True" Mode="Minimized" IsVisible="True">
</shell:ApplicationBar>
</phone:PhoneApplicationPage.Resources>

然后在Pivot的selectionChanged事件中修改对应的AppBar,第三个设置为NULL即没有AppBar,就完事啦。

private void Pivot_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (pivot.SelectedIndex == )
{
ApplicationBar = (Microsoft.Phone.Shell.ApplicationBar)Resources["AppBar_1"];
}
else if (pivot.SelectedIndex == )
{
ApplicationBar = (Microsoft.Phone.Shell.ApplicationBar)Resources["AppBar_2"]; }
else if (pivot.SelectedIndex == )
{
ApplicationBar =null ;
}
}

效果就是前面那个GIF的效果,但是你现在回去看前面那个GIF会发现切换的时候有个黑条,发生在AppBar改变高度的时候,在我实际使用中如果再在加上AppBarMenu的话,会产生更明显的黑条,并造成非常非常非常非常明显的卡顿。(手头的机子是920)

这个问题简直神坑,网上资料很少,所以我就传播一下找到的方法吧(●'◡'●),让AppBar”拥有透明特性“,即让opacity(透明度)不等于1。如果你想要的是纯色不透明的效果(其实也只有这种情况才会遇到这个问题。。。),opacity(透明度)设置为0.99,可以解决黑条问题,而且看起来仍然是纯色不透明的。

<phone:PhoneApplicationPage.Resources>
<shell:ApplicationBar x:Key="AppBar_1" BackgroundColor="Silver" Mode="Default" IsVisible="True" Opacity="0.99">
<shell:ApplicationBarIconButton IconUri="/Assets/AppBar1/add.png" Text="添加"/>
<shell:ApplicationBarIconButton IconUri="/Assets/AppBar2/check.png" Text="确认"/>
</shell:ApplicationBar>
<shell:ApplicationBar x:Key="AppBar_2" BackgroundColor="Silver" IsMenuEnabled="True" Mode="Minimized" IsVisible="True" Opacity="0.99">
</shell:ApplicationBar>
</phone:PhoneApplicationPage.Resources>

这样解决了黑条问题以及性能问题,事情会变成这样,怎么想都是微软的错。。。

下面的GIF就是opacity改成0.99后的效果,和前图的视觉效果没什么差,但是没有黑条流畅多了。

解释:以我的理解,如果AppBar的opacity为1,就会被认为是完全不透明,于是AppBar的”底下“就没必要加载应用的”UI的元素“,反正也看不到,所以它底下就是空白的frame页面,颜色和背景色的黑白设定一致(多数人是选的是黑色背景)。这时如果AppBar高度降低或者消失,一瞬间就会暴露底下的frame,让你看到相同大小的黑条或者白条,然后在frame上加载应有的UI元素(比如背景图案之类的),这也造成了一些卡顿感。。。如果AppBar是半透明的,它底下就是的UI元素在一开始就是加载好的(这样你才能透过AppBar看到它们),就不会出现黑条/白条,也不卡了。

  有时候我们希望AppBar是纯色不透明的,把opacity设置为0.99,正常人看不出差异,但是系统认为他是半透明的。

<WP8开发学习笔记>ApplicationBar(任务栏)的切换以及“黑条问题”的更多相关文章

  1. <WP8开发学习笔记>获取手机的常用型号(如Lumia920,而非RM-822)

    之前WP7时代可以用API获得WP手机的型号如lumia510,但是到了WP8后用APi只能获得硬件版本号了如RM-822,这种型号可以让我们更详细的了解具体的硬件版本,比如国行和港行,设备版本号不一 ...

  2. <WP8开发学习笔记>动态修改启动时导航的第一个页面(如登录前启动页为LoginPage,登录后变为MainPage)

    很多时候我们需要在启动程序的时候根据状态改变初始导航页面,比如程序在启动的时候判断用户是否登录, 如果未登录则跳转到LoginPage.xaml否则跳转到MainPage界面. 这时候就要分析程序的启 ...

  3. <WP8开发学习笔记>修改panorama全景控件的标题的大小

    panorama(全景)控件非常具有WinPhone特色,但是那个巨大的标题许多时候会让人觉得违和.怎么修改它呢? 最开始想到的是加一个FontSize,结果毫无影响.╮(╯-╰)╭ <phon ...

  4. 【前端】移动端Web开发学习笔记【2】 & flex布局

    上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...

  5. 【前端】移动端Web开发学习笔记【1】

    下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...

  6. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  7. android开发学习笔记000

    使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...

  8. 高性能Cordova App开发学习笔记

    高性能Cordova App开发学习笔记 文件结构 添加插件 构建准备 各个www的作用,prepare命令会将hello\www的内容会拷贝到platform下的wwww目录,知道该改哪里了吧?如果 ...

  9. Rest API 开发 学习笔记(转)

    Rest API 开发 学习笔记 概述 REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式.获得这些表徵致使这些应用程序转变了其状态.随着 ...

随机推荐

  1. 关于MySQL数据被删除后空间重用的问题实验

    以前知道,MySQL在通过delete语句删除数据后,空间并不会被腾出,而只是在数据文件中被标记为已删除,除非执行optimize table.前两天听说,虽然delete数据后硬盘空间不会被腾出,但 ...

  2. How To Mitigate Slow HTTP DoS Attacks in Apache HTTP Server

    http://www.acunetix.com/blog/web-security-zone/articles/slow-http-dos-attacks-mitigate-apache-http-s ...

  3. 使用脚手架 vue-cli 4.0以上版本创建vue项目

    1. 什么是 Vue CLI 如果你只是简单写几个Vue的Demo程序, 那么你不需要Vue CLI:如果你在开发大型项目, 那么你需要, 并且必然需要使用Vue CLI. 使用Vue.js开发大型应 ...

  4. git rebase 还是 merge的使用场景最通俗的解释

    什么是 rebase? git rebase 你其实可以把它理解成是“重新设置基线”,将你的当前分支重新设置开始点.这个时候才能知道你当前分支于你需要比较的分支之间的差异. 原理很简单:rebase需 ...

  5. kali中安装漏洞靶场Vulhub(超详细)

    前言 我们都知道,在学习网络安全的过程中,搭建漏洞靶场有着至关重要的作用.复现各种漏洞,能更好的理解漏洞产生的原因,提高自己的学习能力.下面我在kali中演示如何详细安装漏洞靶场Vulhub. 什么是 ...

  6. 使用Buildpacks高效构建Docker镜像

    1. 前言 Spring Boot 2.3.0.RELEASE 正式发布了几天了,其中有个新的特性:可以将Spring Boot应用代码直接打包为Docker镜像.这是什么科技?我赶紧去官网查了一番才 ...

  7. ECharts使用教程

    引入 ECharts ECharts 3 开始不再强制使用 AMD 的方式按需引入,代码里也不再内置 AMD 加载器.因此引入方式简单了很多,只需要像普通的 JavaScript 库一样用 scrip ...

  8. Oracle阻塞会话源头查找-单机和RAC环境

    在写 Oracle session相关数据字典(一)  这篇文章时,提到使用v$session视图的树形查询可以得到Oracle锁树,这样就便于我们找出阻塞会话的源头,但是仅仅可以在单机环境中使用.今 ...

  9. 读Pyqt4简介,带你入门Pyqt4 _001

    PyQt是用来创建GUI应用程序的工具包,它把Python和成功的Qt绑定在一起,Qt库是这个星球上最强大的库之一,如果不是最强大的话. PyQt作为一组Python模块的实现.有超过300个类和超过 ...

  10. python报错2

    缩进导致的报错 IndentationError: unindent does not match any outer indentation level NameError 命名错误 原因是: na ...