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

标签 wpf silverlight xaml shape

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

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

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

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

最佳答案

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

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

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

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

所以,要么自定义 ControlUserControl恐怕是要走的路。这不应该停止 MouseEnterMouseLeave虽然工作。你真的发现那些不起作用吗?还是您只是假设它们不起作用?

关于wpf - Silverlight 中的自定义形状(从 WPF 移植应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1373099/

相关文章:

C# XAML - 获取 XAML 内容属性 (contentControl.Content)

WPF MVVM 数据绑定(bind)在页面导航后被破坏

apache-flex - Flash、Flex、Adobe Air、Java FX 和 Silverlight 的这些业务是什么?

c# - 如何防止回到上一页

c# - 只读集合 c# wp7 不支持操作

windows - 我们如何禁用 silverlight windows phone 7 中文本框的默认键盘?

xaml - 如何在 XAML webview 中设置滚动条主题?

c# - 从列表框中拖放项目时出现一些错误

wpf - 如何获取子元素相对于父元素的位置?

c# - 如何为具有集合的模型创建 View 模型