代码之家  ›  专栏  ›  技术社区  ›  Nathan Wheeler

要数据库的形状列表

  •  2
  • Nathan Wheeler  · 技术社区  · 15 年前

    我有一个通用的形状集合,需要通过wcf将其存储在数据库中以供将来/共享使用。不幸的是,system.windows.shapes都是密封的,因此我无法继承它们并对它们进行可序列化的复制。我“可以”编写自己的自定义可序列化形状集,因为我已经为我的应用程序编写了3个自定义形状,但如果可能的话,我不想这样做。

    我完全知道我可以使用XamlReader和XamlWriter将它们从屏幕上取下,然后放回屏幕上,但这还不够好,因为包含形状的网格的大小并不总是相同的,我需要相应地重新定位形状。这些形状正被用作另一个图像上的覆盖层,并且这些形状在背景图像上保持在同一位置非常重要。

    如有任何建议或帮助,我们将不胜感激。

    ~Md5SUM~

    2 回复  |  直到 15 年前
        1
  •  3
  •   Bill Yang    15 年前

    另一种解决方案是创建序列化方法,该方法以形状作为参数,并将属性序列化为XML或您希望的任何内容。例如:

    /// <summary>use reflection to serialize all properties and type into an xml string</summary>
    /// <param name="s">shape object to be serialized</param>
    /// <return>the serialized xml string</return>
    public static string SerializeShape(Shape s);
    
    /// <summary>create a new Shape object with given xml data</summary>
    /// <param name="s">xml serialization generated by SerializeShape(Shape s)</param>
    /// <return>the constructed shape</return>
    public static Shape DeserializeShape(string s);
    

    您可能需要稍微更改方法以更好地适应对象。最坏的情况是,您必须为不同的形状创建一些这些序列化/反序列化方法的对。

        2
  •  0
  •   Rap    15 年前

    你说得对。如果它们是密封的,它们就不能被继承,因此不能被序列化。您将不得不创建自己的自定义形状类。我假设您对此的问题是不希望重新创建所有方法和属性。

    我建议你创建“精简”的形状(就像今日美国是“精简”的新闻)。只需输入完全定义每个形状所需的最小属性:

    • 方形:宽度(双),旋转 角度(双)和中心(点)。
    • 矩形:宽度、高度、中心和旋转角度。
    • 圆:半径(双),中心
    • 椭圆:宽度、高度、中心、旋转 …等等。

    当反序列化它们时,您将实例化实际的system.windows.shapes,但不必重新创建整个过程。