15

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

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

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

我主要是一名后端开发人员,所以这不是我的强项——如果有人能给我一个关于如何实现这一目标的概要示例,我将不胜感激。

4

4 回答 4

16

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

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

在 WPF 中,您可以在两个完全不同的级别上工作:可视层或框架层。可视层的服务由 WindowsBase.dll 和 PresentationCore.dll 提供。这提供了基本的渲染和输入服务。但是如果你想要样式、数据绑定、布局、模板等等,你需要框架服务,这些都是由 PresentationFramework.dll 提供的。形状类型 - RectanglePath等 - 都是框架类型 - 它们派生自FrameworkElement并支持数据绑定、布局、动画等。但是它们是在可视层之上实现的——如果您查看ShapeReflector 或 ILDASM 中的任何类型,您会发现它们都覆盖了该OnRender方法,这就是定义实际形状的代码所在的位置。(OnRender是一个可视层函数。)而且由于可视层是一个完全受支持和文档化的 API,您可以自由地在 WPF 中编写自己的形状 - 您可以编写与内置的完全相同类型的代码 -在形状类中。

Silverlight 不区分这种视觉/框架 - 在 Silverlight 中,WPF 的视觉层本质上已经折叠到框架层中。因此,如果您查看 Reflector 或 ILDASM 中的形状类型,您会发现它们不包含任何OnRender方法,而且几乎是空的。那是因为在 Silverlight 中,形状都是内在的 - 该插件具有内置的特殊处理Ellipse,Path和所有其他形状。所以这组形状在 Silverilght 中是不可扩展的。Silverlight中没有OnRender覆盖的方法。因此,您根本无法编写自己的从ShapeSilverlight 派生的自定义类。

因此,恐怕要走习惯Control或将要走的路。UserControl不过,这不应该阻止MouseEnterandMouseLeave的工作。你真的发现那些不起作用吗?还是您只是假设它们不起作用?

于 2010-12-14T11:35:38.340 回答
0

如果保留现有的类,让我们按原样将其称为 CustomShape,然后从 Control 中固有地使用 CustomShapeContainer 之类的东西呢?CustomShapeContainer 本质上只是 CustomShape 的包装器。然后,您可以将所有进入 CustomShapeContainer 的事件直接传递给 CustomShape,然后将形状 DefiningGeometry 对象作为 Containers 内容返回。

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

于 2010-11-05T21:44:29.987 回答
0

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

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

于 2010-12-13T18:27:39.890 回答
0

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

于 2010-12-16T13:31:01.550 回答