代码之家  ›  专栏  ›  技术社区  ›  Saqib

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

  •  15
  • Saqib  · 技术社区  · 15 年前

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

    应用程序包含一个从形状继承的类。它重写DefiningGeometry属性以返回路径对象。但是,Silverlight形状类没有DefiningGeometry属性。

    在网上阅读,我发现其他人也有同样的问题。解决方案似乎包括直接从控件继承,并将内容属性设置为路径。但是,我还希望保留我的事件处理程序(mouseenter、mouseleave、gotfocus、lostfocus),另外我希望它保持其位置,并与应用程序的其余部分成比例地调整大小。

    我主要是一个后端开发人员,所以这不是我的长处——如果有人能给我一个如何实现这一目标的概要样本,我会很感激的。

    4 回复  |  直到 15 年前
        1
  •  16
  •   Ian Griffiths    14 年前

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

    无法在SilverLight中创建自定义形状的原因是Silverlight不共享WPF的“可视层”。如果您想完全理解为什么您所尝试的是不可能的,您需要了解Silverlight与WPF在这里的区别。(如果你不在乎,跳过下面两段。)

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

    Silverlight没有这种视觉/框架的区别-在Silverlight中,WPF的视觉层基本上已经折叠到框架层中。因此,如果您查看Reflector或ILDASM中的形状类型,就会发现它们不包含 向上渲染 方法,它们几乎是空的。这是因为在Silverlight中,这些形状都是内部的-插件内置了特殊的处理 Ellipse ,请 路径 以及所有其他形状。所以这组形状在银光中是不能延伸的。没有 向上渲染 在Silverlight中重写的方法。因此,您不能编写自己的自定义类 形状 在Silverlight中。

    所以,要么是一种习俗 Control 或者 UserControl 恐怕是去的路了。这不应该阻止 MouseEnter MouseLeave 尽管如此。你真的发现那些不管用吗?或者你只是假设它们不起作用?

        2
  •  0
  •   matheeeny    14 年前

    如果保留现有的类,让我们称它为CustomShape,就像以前一样,然后用CustomShapeContainer之类的控件固有的那样?CustomShapeContainer本质上只是一个围绕CustomShape的包装。然后,可以将所有进入CustomShapeContainer的事件直接传递到CustomShape中,然后将定义形状的几何体对象返回为容器内容。

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

        3
  •  0
  •   Pepe Marino    14 年前

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

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

        4
  •  0
  •   Simon Mourier    14 年前

    从Silverlight 3开始,有一种特殊类型的形状称为 Path 定义了一个属性 Data 几何类型。您应该能够将创建几何图形的原始WPF代码移植到此数据属性。