【WP开发】认清“不透明度”与“可见性”的区别
这两种情况,许多朋友平时都没有注意到:
1、设置Opacity属性的值为0;
2、将Visibility属性设置为Collapsed。
不少人会简单地认为这两种情况是一样的,都是让UI元素看不见。
我告诉你:非也,非也。如果你认为这两种情况是一样的话,就出现了误解,这样在实际开发中很容易出现困惑,尤其是开发自定义控件的时候。
那么,两种情况到底有何不同? 不用着急,通过一个非常简单的例子就能知道了。
比如以下XAML:
<Grid Width="300" Height="300">
<Image Source="Assets/1.jpg" Stretch="UniformToFill" Tapped="OnTapped"/>
<Border Background="Green" Opacity="0" />
</Grid>
在Grid中有两个子对象,Image位于底层,Border覆盖在Image上,注意一定要设置Border的Background属性,这样才能使元素的内部被画刷填充,否则这个例子就没有测试意义了。设置Border的背影为绿色,比较环保。然后再把它的Opacity属性设置为0,表示它是完全透明的。
那么,这样是不是表明Border元素已经隐藏了呢。不是的,为了验证这一点,处理了Image的Tapped事件,然后在事件处理代码的方法上打一个断点。如下图。

现在运行应用程序,你会发现,无论你怎么点击屏幕上的图片,Tapped事件都不会发生,即没有进入到上面所设置的断点处。
就算你用一阳指把屏幕点碎,也不会发生Tapped事件。
这是为啥呢?
虽然Opacity属性的值为0,Border已完全透明,但并不说明它就隐藏了,实际上它还在,只是我们看不见而已,同时因为Border元素是位于Image元素之上的,即Image被Border挡住了,你刚才所点击的其实是Border元素,而不是Image元素。
现在把代码改一下:
<Grid Width="300" Height="300">
<Image Source="Assets/1.jpg" Stretch="UniformToFill" Tapped="OnTapped"/>
<Border Background="Green" Visibility="Collapsed" />
</Grid>
Visibility="Collapsed"才真正把Border元素隐藏,所以现在运行程序后,点击屏幕上的图片,Tapped事件就会引发了。
通过以上极其简单的例子,可以发现:
将Opacity属性设置为0并不是真的隐藏了UI元素,也就是说它还是被呈现了的,但前提是元素要有填充画刷,如果不填充,那么元素的内部区域不会被绘制,这样就无法比较了。
而将Visibility属性设置为Collapsed会使得元素不在图形界面上呈现,即没有被绘制,自然就不会挡住下方的Image元素,这时候,Image的Tapped事件就能够发生。
总的一句话:“不透明度”为0是看不见而已,对象仍然被绘制的;只有将Visibility属性设置为Collapsed才能使对象真正隐藏。
其实,在WPF、SL中都是如此,因为Windows很多新的UI方案都可以认为是WPF的子集。故学好WPF就可以通杀了。
【WP开发】认清“不透明度”与“可见性”的区别的更多相关文章
- WP开发资源
wp开发:连续两次点击返回键退出程序的设计: http://hi.baidu.com/youngytj/item/6be317719cc371306cc37ce4 X http://www.cnblo ...
- WP开发笔记——WP7 SDK使用技巧
俗话说的好,工欲善其事,必先利其器. 入门WP开发之前,免不了要先接触开发环境和开发工具.使用WP7 SDK进行开发,我们需要掌握SDK的一些实用技巧,以便我们的开发. 一.开启/关闭电脑键盘输入 W ...
- 在知乎回答的一个问题:C#初学者以后往WP开发走,还是往unity3d走?哪个更有前景呢
问题原文:我是一个C#初学者,想问个问题,我以后是该往WP开发方向走呢还是学习Unity3D往游戏开发,哪个更有前景呢,个人感觉未来几年iOS,WP,Java会三足鼎立,WP现在有潜力,但是U3D现在 ...
- WP开发使用BingMaps地图服务
原文:WP开发使用BingMaps地图服务 WP8使用BingMaps地图在 SOAP服务如何计算路径 首先需要用到3个服务 1.GeoCode服务-转换地址到地理的经纬度(WebServices地址 ...
- WP 开发中.xaml 与.xaml.cs
关于 WP 开发中.xaml 与.xaml.cs 的关系 今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: ...
- volatile和synchronized实现内存可见性的区别
先看看synchronized实现内存可见性 加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另外一个重要的方面:内存可见性.我们不仅希望防止某个线程正在使用对象状态而另一个 ...
- 系统不支持WP开发
好伤心,,,系统不支持WP开发... 买的ThinkPad S5 自带的win8,既不属于专业版,也不属于家庭版,,不属于各种版本. 其他条件都满足了.. 难道我要还系统吗??
- ***php进行支付宝开发中return_url和notify_url的区别分析
本文实例分析了php进行支付宝开发中return_url和notify_url的区别.分享给大家供大家参考.具体分析如下: 在支付宝处理业务中return_url,notify_url是返回些什么状态 ...
- asp.net简述WP开发模式
详情请参考菜鸟教程:http://www.runoob.com/aspnet/aspnet-tutorial.html 1.ASP.NET 是一个使用 HTML.CSS.JavaScript 和服务器 ...
随机推荐
- JS中可拖拽的甘特图和流程图
甘特图: https://www.douban.com/note/441706674/ https://www.uedsc.com/jquery-ganttview.html https://gith ...
- log4j写入数据库
转发自http://www.cnblogs.com/adolfmc/p/3432720.html Log4j 配置数据库连接池(将日志信息保存到数据库) org.apache.log4j.jdbc.J ...
- js 获取样式兼容方法
function getStyle(obj, attr) { if(obj.currentStyle) { return obj.currentStyle[attr]; } else { return ...
- [原] XAF 如何启用ListView Top N records 提升用户使用体验
為了提升用戶使用體驗,特擴展此功能(來源與Xafari Framework).1.可在模型編輯器中設置是否啓用,默認啓用.2.DataAccessMode為Client模式才啓用.其它模式自動關閉.3 ...
- rabbitmq集群安装
在配置文件中配置集群没有成功,但是使用命令行成功了,以下是过程请参考. 场景:两台机器,一台是10.1.3.95 hostname为mq1,一台是10.1.3.96 hostname为 ...
- 《Python标准库》 目录
目录 译者序序前言第1章 文本1.1 string—文本常量和模板1.1.1 函数1.1.2 模板1.1.3 高级模板1.2 textwrap—格式化文本段落1.2.1 示例数据1.2.2 填充段落1 ...
- FreeRTOS任务栈
configTOTAL_HEAP_SIZE 定义堆大小,FreeRTOS 内核,用户动态内存申请,任务栈,任务创建,信号量创建,消息队列创建 等都需要用这个空间.
- 【设计模式之装饰者模式InJava】
需求:定义一个操作系统OS接口,安装Windows10操作系统,在上面安装虚拟机VMWare,虚拟机里装Linux; 然后在Linux中安装虚拟机VMware,再在虚拟机里安装MacOS操作系统. 实 ...
- 可在广域网部署运行的QQ高仿版 -- GG叽叽(源码)
前段时间看到园子里有朋友开发了QQ高仿版的程序,我也非常有兴趣,以前一直有个做即时聊天程序的梦,趁这段时间工作不是很忙,就开始动手来做这个事情.根据我以往积累下来的项目经验,实现QQ的基本功能,问题应 ...
- AndroidPn源码分析(一)
好了,开始研究源码了.目前对androidpn,只限于使用过它,跑了一下demo.现在开始研究一下源码. (一)入口 当服务器端启动的时候,控制台会打印一些log,除了spring和hibernate ...