2009-09-03 99 views
15

我正在将WPF应用程序转换为Silverlight。Silverlight中的自定义形状(从WPF移植应用程序)

该应用程序包含一个继承自Shape的类。它重写DefiningGeometry属性以返回一个Path对象。但是,Silverlight Shape类没有DefiningGeometry属性。

在互联网上阅读我发现其他人也遇到同样的问题。该解决方案似乎涉及直接从Control继承,并将Content属性设置为路径。但是,我还想保留我的事件处理程序(MouseEnter,MouseLeave,GotFocus,LostFocus),另外我希望它保持其位置并根据应用程序的其余部分调整比例。

我主要是一名后端开发人员,所以这不是我的专长 - 如果有人能给我一个如何实现这一目标的大纲示例,我将不胜感激。

+4

如果您发布原始课程,您可能会收到更多回复。然后其他人可以很快为你重写。祝你好运。 – 2010-08-30 15:47:27

+0

这是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

回答

16

由于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中,这些形状都是内在的 - 插件内置了对EllipsePath以及所有其他形状的特殊处理。所以这组形状在Silverilght中不可扩展。没有OnRender方法在Silverlight中重写。所以你根本无法编写自己的自定义类,该类自Silverlight中的Shape派生。

因此,无论是自定义的Control还是UserControl恐怕都是要走的路。这不应该阻止MouseEnterMouseLeave正常工作。你真的发现那些不起作用吗?或者你只是假设他们不会工作?

+0

+1了解你的理论,特别是对于那些新颖的范例。 – Alain 2010-12-16 15:15:29

+0

+1优秀答案 – ColinE 2012-02-17 08:11:02

+0

+1解释,-1给微软完全可蹩脚的扩展! – 2012-09-05 17:34:59

0

如果保留现有的类,让我们称它为CustomShape,就像CustomShapeContainer那样,它是Control所固有的? CustomShapeContainer本质上只是CustomShape的一个包装。然后,您可以将进入CustomShapeContainer的所有事件直接传递到CustomShape,然后将形状DefininingGeometry对象作为Containers内容返回。

乍一看,这似乎是阻力最小的路径。

0

您在Silverlight中没有相同的命名空间。 Silverlight xaml是WPF xaml的一个子集,有些组件不包含在Silvelright中。这些技术旨在用于不同类型的OS解决方案。

您可能需要重新开始。但是,如果您使用了MVVM模式,那么您可能会重新使用您的ViewModel,Model和服务。也许资源,样式可以重用“原样”。但视图:开始新的。

0

从Silverlight 3开始,有一种称为Path的特殊类型的Shape,它定义了几何类型的属性Data。您应该能够将创建几何图形的原始WPF代码移植到此Data属性。

+1

我知道你的链接建议的MSDN文章,否则,但从一开始,Path就已经在Silverlight中。 – 2011-06-12 21:20:51