由于Silverlight不支持创建基于Shape
基类的自定义元素,因此您将无法生成以相同方式工作的类。
在Silverlight中无法创建自定义形状的原因是Silverlight不共享WPF的“可视化层”。如果你想充分理解为什么你所尝试的是不可能的,你需要了解Silverlight和WPF在这里的区别。 (如果你不在乎,请跳过下面的两段。)
在WPF中,你可以在两个完全不同的层次上工作:可视层或框架层。可视化图层的服务由WindowsBase.dll和PresentationCore.dll提供。这提供了基本的渲染和输入服务。但是如果你想要样式,数据绑定,布局,模板等等,你需要框架服务,并且这些服务由PresentationFramework.dll提供。形状类型 - Rectangle
,Path
等等 - 都是框架类型 - 它们来自FrameworkElement
,它们支持数据绑定,布局,动画等等。但是它们是在可视层之上实现的 - 如果您在Reflector或ILDASM中查看Shape
类型中的任何一个,则会看到它们全都覆盖了OnRender
方法,这就是定义实际形状的代码所在的位置。 (OnRender
是一个可视化图层功能。)而且由于可视图层是一个完全支持和记录的API,因此您可以自由地在WPF中编写自己的图形 - 您可以编写完全相同的代码,如内置的形状类。
Silverlight不会使这种视觉/框架的区别 - 在Silverlight中,WPF的可视层已经基本折叠到框架层中。因此,如果您查看Reflector或ILDASM中的形状类型,您会发现它们不包含OnRender
方法,并且它们几乎为空。这是因为在Silverlight中,这些形状都是内在的 - 插件内置了对Ellipse
,Path
以及所有其他形状的特殊处理。所以这组形状在Silverilght中不可扩展。没有OnRender
方法在Silverlight中重写。所以你根本无法编写自己的自定义类,该类自Silverlight中的Shape
派生。
因此,无论是自定义的Control
还是UserControl
恐怕都是要走的路。这不应该阻止MouseEnter
和MouseLeave
正常工作。你真的发现那些不起作用吗?或者你只是假设他们不会工作?
如果您发布原始课程,您可能会收到更多回复。然后其他人可以很快为你重写。祝你好运。 – 2010-08-30 15:47:27
这是silverlight论坛上未解决的问题http://forums.silverlight.net/forums/p/39904/113634.aspx,甚至是silverlight 4中的子类形状的解决方案(http://blogs.msdn.com/b /nickkramer/archive/2009/12/03/subclassing-shape-or-more-accurately-path.aspx)对DefiningGeometry属性问题没有帮助。我们应该为此解决问题。 – Alain 2010-12-13 20:08:26