Silverlight中的自定义形状(从WPF移植应用程序)

时间:2009-09-03 12:26:21

标签: wpf silverlight xaml shape

我正在将WPF应用转换为Silverlight。

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

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

我主要是一名后端开发人员,所以这不是我的强项 - 如果有人能给我一个如何实现这一目标的大纲样本,我会很感激。

4 个答案:

答案 0 :(得分:16)

您将无法生成以相同方式工作的类,因为Silverlight不支持创建派生自Shape基类的自定义元素。

在Silveright中无法创建自定义形状的原因是Silverlight不共享WPF的“可视层”。如果你想完全理解为什么你的尝试是不可能的,你需要了解Silverlight与WPF的不同之处。 (如果你不在乎,请跳过接下来的两段。)

在WPF中,您可以在两个完全不同的级别工作:可视层或框架层。可视层的服务由WindowsBase.dll和PresentationCore.dll提供。这提供了基本的渲染和输入服务。但是如果您需要样式,数据绑定,布局,模板等内容,则需要框架服务,这些服务由PresentationFramework.dll提供。形状类型 - RectanglePath等 - 都是框架类型 - 它们派生自FrameworkElement,它们支持数据绑定,布局,动画等。但是它们是在可视层之上实现的 - 如果你查看Reflector或ILDASM中的任何Shape类型,你会发现它们都覆盖了OnRender方法,而这就是定义代码的地方实际的形状生活。 (OnRender是一个可视化图层功能。)因为可视图层是一个完全支持和记录的API,你可以在WPF中自由编写自己的形状 - 你可以编写完全相同类型的代码。找到内置的形状类。

Silverlight没有使这种视觉/框架区别 - 在Silverlight中,WPF的可视层基本上已经折叠到框架层中。因此,如果您查看Reflector或ILDASM中的形状类型,您会发现它们不包含OnRender方法,并且它们几乎是空的。这是因为在Silverlight中,形状都是内在的 - 插件内置了EllipsePath以及所有其他形状的特殊处理。因此,这组形状在Silverilght中无法扩展。 Silverlight中没有要覆盖的OnRender方法。因此,您根本无法编写自己的自定义类,该类来自Silverlight中的Shape

因此,无论是自定义Control还是UserControl都是可行的方法,我担心。这不应该阻止MouseEnterMouseLeave工作。你真的发现那些不起作用吗?或者你只是假设他们不会工作?

答案 1 :(得分:0)

如果保留现有的类,我们可以将其称为CustomShape,然后使用CustomShapeContainer之类的东西来控制它。 CustomShapeContainer基本上只是CustomShape的包装器。然后,您可以将进入CustomShapeContainer的所有事件直接传递到CustomShape,然后将形状DefininingGeometry对象作为Containers内容返回。

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

答案 2 :(得分:0)

您在Silverlight中没有相同的命名空间。 Silverlight xaml是WPF xaml的子集,并且有一些程序集不包含在Silvelright中。这些技术适用于不同类型的解决方案。

您可能需要重新开始。但是,如果您使用MVVM模式,那么很少有代码可以重用您的ViewModel,Model和服务。也许资源,样式可以“按原样”重用。但是观点:开始新的。

答案 3 :(得分:0)

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