在Silverlight自定义形状(从WPF移植应用程序)(Custom Shape in Silv

2019-08-03 13:51发布

我将一个WPF应用程序Silverlight的。

该应用程序包括从形状继承的类。 它覆盖DefiningGeometry属性返回一个Path对象。 然而,Silverlight的Shape类不具有DefiningGeometry财产。

阅读在互联网上我发现别人与此相同的问题。 该解决方案似乎是从控制直接继承,并设置Content属性的路径涉及。 不过,我也想保留我的事件处理程序(的MouseEnter,鼠标离开,的GotFocus,引发LostFocus),加上我想它保持它的位置和比例调整到应用程序的其余部分。

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

Answer 1:

你将不能够生产,在相同的方式工作,因为Silverlight不支持从派生自定义元素创建一个类Shape的基类。

这是不可能创造Silveright自定义形状的原因是,Silverlight不共享WPF的“可视化层”。 如果你想完全理解为什么你想要什么是不可能的,你需要了解的Silverlight是如何从这里WPF非常不同。 (如果你不在乎,跳过下面2段)。

在WPF中,你可以在两个完全不同层次的工作:视觉层,或框架层。 通过WindowsBase.dll中和PresentationCore.dll中提供可视化层的服务。 这提供了基本的渲染和输入服务。 但是,如果你想要的东西喜欢的造型,数据绑定,布局,模板等,你需要的框架服务,而这些是由PresentationFramework.dll提供。 形状类型- RectanglePath ,等等-都是框架类型-它们派生自FrameworkElement ,他们支持数据绑定,布局,动画等。 但他们在视觉层的基础上实现的-如果你看任何的Shape的反射或ILDASM类型,你会看到他们都覆盖OnRender方法,而这也正是该代码定义实际形状的生活。 ( OnRender是一个可视化层功能。)而由于视觉层是完全支持和记录的API,你可以自由地写自己的形状在WPF中-你可以写排序完全相同的代码,你会在找到内置的形状类。

Silverlight不使这种视觉/框架的区别 - 在Silverlight,WPF的可视层基本上已经坍塌成框架层。 所以,如果你看一下在反射或ILDASM的形状类型,你会看到它们不包含OnRender方法,而且他们几乎是空的。 这是因为在Silverlight,形状都是内部函数-该插件还内置了特殊处理的EllipsePath ,以及所有其他形状。 因此,组形状不开分机在Silverilght。 没有OnRender方法在Silverlight覆盖。 所以,你根本就不会写,从派生自己的自定义类Shape在Silverlight。

所以,无论是自定义的ControlUserControl将要走的路,我害怕。 这不应该停止MouseEnterMouseLeave的工作,虽然。 你实际上已经发现,那些不工作? 或者仅仅是假设,他们将无法正常工作?



Answer 2:

如果保留现有的类,让我们把它叫做CUSTOMSHAPE,如,然后从内在控制的东西,如CustomShapeContainer? CustomShapeContainer将基本上只是围绕CUSTOMSHAPE的包装。 然后,您可以通过所有进入CustomShapeContainer直接通过进CUSTOMSHAPE事件,然后返回形状DefininingGeometry对象作为容器的内容。

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



Answer 3:

您不必在Silverlight相同的命名空间。 Silverlight的XAML是WPF XAML的一个子集,并有这不包括在Silvelright组件。 这些技术被用于不同类型的操作系统解决方案。

您可能需要重新开始。 但是,如果您使用的MVVM模式,背后很少的代码,那么你可能能够重复使用您的视图模型,模型和服务。 也许资源,风格将是美好的重用“原样”。 但视图:开始新的。



Answer 4:

在Silverlight 3开始,有一个名为一种特殊类型的形状的路径定义属性数据的几何类型。 你应该能够端口创建一个几何此数据属性的原始WPF代码。



文章来源: Custom Shape in Silverlight (porting app from WPF)