Silverlight中的NullExtension与Transparent在事件处理中的相异性

    中国有句古话叫:“好事多磨”,在程序设计的日子里,这似乎更常见不过了。在程序员的世界里,为了一个看似小的问题通宵达旦,甚至于几天几夜的琢磨也是司空见惯的事。不过你的这些努力没有白费,它会给你带来巨大的惊喜,让你记忆深刻。本文就是这样的经历,言归正题。下面谈一谈WPF中的NullExtension和Transparent这两个属性是如何影响到我们项目中的鼠标事件的。(之所以这儿用WPF,是因为Silverlight是它的一个子集。这是两者的相通性)

1、NullExtension元素

定义在XML命名空间的“http://schemas.microsoft.com/winfx/2006/xaml/presentation”下,这意味着我们只要在XAML标记中写成如下形式即可: {x:NullExtension},简单到:{x:Null}即可。

2、Transparent

逻辑上讲这只是一个标记值,是可以设置给Brush对象的一个属性。意味着设置给Brush它将在视觉上是透明的。

Silverlight在设计鼠标路由事件时,将元素的形状考虑在范围之内了,所以如果我们在设置一个元素如ListBox的背景色为上面的两种方式中的其中一种都会产生不一样的结果。

1、 ListBox的Background=”Transparent”,这时它的子项:ListBoxItem会得到我们的鼠标事件就如设置得不透明的效果一样,正常响应事件

2、 ListBox的Background=”{x:Null}”时,这里它的子项:ListBoxItem将得不到我们的鼠标响应事件,与第一种情况相反。我们的背景是透明的,但是不会响应我们的鼠标事件。不管你的IsHitTest属性是True还是False,效果都一样。

这个问题是我在使用Expression Blender的3DWall示例中见到的一种情况,以下是程序中的一段XAML语句:

无标题

模板中设置了LIstBox的鼠标Click和Wheel事件处理。如果将上面的模板放在ListBox控件中,如:

<ListBox ItemsPanel="{StaticResource ItemsPanelWall3DTemplate}"…/>

这时我们会发现Click和Wheel事件都不能响应。就像没有附加事件一样。如果将Background改为Background=”Transparent”或”#00000000”,那么我们的程序就会得到我们期望的Click和Wheel响应了。

无标题

有兴趣的朋友可以在微软的Expression Blend 工具软件自带的范例3DWall测试,以验证这两者的区别。或者下载本文的范例:代码

posted @ 2010-05-14 14:55  suyan010203  Views(369)  Comments(2Edit  收藏