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

Saq*_*qib 15 silverlight wpf xaml shape

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

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

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

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

Ian*_*ths 16

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

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

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

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

所以,无论是习俗Control还是UserControl将要走的路,我都害怕.这不应该阻止MouseEnterMouseLeave工作.你真的发现那些不起作用吗?或者你只是假设他们不会工作?