InkCanvas和图像保存/加载重载的StrokeCollection

时间:2017-12-14 06:13:51

标签: c# wpf save inkcanvas

我正在开发一个具有InkCanvas的应用程序,一个被设置为InkCanvas的背景图像的图像,以及与每个Stroke相关联的数值数据(每个Stroke的一个正整数值) InkCanvas。

我的第一个心理方法是重载Stroke类以将数值数据添加为字段。但是,我不确定我是否可以使用InkCanvas.Strokes.Save(FileStream);保存StrokeCollection

我的第二个心理方法是保存笔划集合,并为存储在单独的SQLite文件中的每个笔划拥有不同的数值集合。但是,我不确定StrokeCollection中的Strokes是按顺序存储的,并按顺序加载。

所以问题是,这两种方法中的任何一种都能用于存储Strokes,与每个Stroke相关联的数值,以及图像的文件名,或者如果可能的话,图像本身,而不会生成多个文件?

1 个答案:

答案 0 :(得分:1)

例如,如果您想将笔划保存到xml文件中,可以像这样读/写StrokeCollection:

 /// <summary>
/// Serializable version of StrokeCollection allowing for base64 saving using XMLSerializer
/// </summary>
[Serializable]
public class StrokeCollectionEx : StrokeCollection, IXmlSerializable
{
    public StrokeCollectionEx() { }

    #region " ReadXml "
    /// <summary>
    /// ReadXml
    /// </summary>
    /// <param name="reader"></param>
    public void ReadXml(XmlReader reader)
    {
        string s = reader.ReadElementContentAsString();
        byte[] strokeBits = Convert.FromBase64String(s);
        if (strokeBits != null && strokeBits.Length > 0)
        {
            using (MemoryStream ms = new MemoryStream(strokeBits))
            {
                //Reload this from stream
                this.Clear();
                StrokeCollection sc = new StrokeCollection(ms);
                foreach (Stroke x in sc)
                {
                    this.Add(x);
                }
            }
        }
    }
    #endregion

    #region " WriteXml "
    /// <summary>
    /// WriteXml
    /// </summary>
    /// <param name="writer"></param>
    public void WriteXml(XmlWriter writer)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            Save(ms);
            byte[] strokeBits = ms.ToArray();

            writer.WriteBase64(strokeBits, 0, strokeBits.Length);
        }
    }
    #endregion

    #region " GetSchema "
    /// <summary>
    /// GetSchema
    /// </summary>
    /// <returns></returns>
    public XmlSchema GetSchema()
    {
        return null;
    }
    #endregion
}

您可以删除需要用于读取/保存到数据库的内容