C# InkCanvas和图像在重载StrokeCollection时保存/加载
我正在开发一个应用程序,它有一个InkCanvas,一个设置为InkCanvas背景图像的图像,以及绑定到InkCanvas上每个笔划的数字数据(每个笔划一个正整数值) 我的第一个想法是重载Stroke类,将数字数据作为字段添加。但是,我不确定是否可以使用C# InkCanvas和图像在重载StrokeCollection时保存/加载,c#,wpf,save,inkcanvas,C#,Wpf,Save,Inkcanvas,我正在开发一个应用程序,它有一个InkCanvas,一个设置为InkCanvas背景图像的图像,以及绑定到InkCanvas上每个笔划的数字数据(每个笔划一个正整数值) 我的第一个想法是重载Stroke类,将数字数据作为字段添加。但是,我不确定是否可以使用InkCanvas.Strokes.save(FileStream)保存StrokeCollection 我的第二个想法是保存笔划集合,并将每个笔划的不同数值集合存储在单独的SQLite文件中。但是,我不确定StrokeCollection中的
InkCanvas.Strokes.save(FileStream)保存StrokeCollection代码>
我的第二个想法是保存笔划集合,并将每个笔划的不同数值集合存储在单独的SQLite文件中。但是,我不确定StrokeCollection中的笔划是否按顺序存储并按顺序加载
所以问题是,这两种方法中的任何一种都可以用来存储笔划、与每个笔划相关的数值和图像的文件名,或者如果可能的话,存储图像本身,而不生成多个文件吗?例如,如果要将笔划保存到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
}
//
///StrokeCollection的可序列化版本,允许使用XMLSerializer进行base64保存
///
[可序列化]
公共类StrokeCollectionEx:StrokeCollection,IXmlSerializable
{
公共StrokeCollectionEx(){}
#区域“ReadXml”
///
///ReadXml
///
///
公共void ReadXml(XmlReader)
{
字符串s=reader.ReadElementContentAsString();
byte[]strokeBits=Convert.fromBase64字符串;
if(strokeBits!=null&&strokeBits.Length>0)
{
使用(MemoryStream ms=新的MemoryStream(strokeBits))
{
//从流中重新加载此文件
这个.Clear();
StrokeCollection sc=新的StrokeCollection(毫秒);
foreach(sc中的冲程x)
{
本条增补(x);
}
}
}
}
#端区
#区域“WriteXml”
///
///WriteXml
///
///
public void WriteXml(XmlWriter)
{
使用(MemoryStream ms=new MemoryStream())
{
保存(ms);
字节[]strokeBits=ms.ToArray();
writer.WriteBase64(strokeBits,0,strokeBits.Length);
}
}
#端区
#区域“GetSchema”
///
///GetSchema
///
///
公共XmlSchema GetSchema()
{
返回null;
}
#端区
}
您可能可以剪切出需要用于读取/保存到数据库的内容您可以轻松尝试您的每一个想法并了解其工作原理。