如何在WPF中克隆画布

如何在WPF中克隆画布,wpf,wpf-controls,drawing,Wpf,Wpf Controls,Drawing,你好。我尝试创建图形编辑器(如Paint)。所以,我需要创建“撤消”和“重做”按钮。如果我复制画布的子对象,当canvas.Children包含许多项时,会花费太多时间。如何实现撤消和重做操作?我从未使用过Canvas,但为了克隆它,我尝试了以下方法,似乎效果不错: Canvas canvas = new Canvas(); canvas.Background = Brushes.Thistle; Canvas clonedCanvas = ElementClone<Canvas>

你好。我尝试创建图形编辑器(如Paint)。所以,我需要创建“撤消”和“重做”按钮。如果我复制画布的子对象,当canvas.Children包含许多项时,会花费太多时间。如何实现撤消和重做操作?

我从未使用过
Canvas
,但为了克隆它,我尝试了以下方法,似乎效果不错:

Canvas canvas = new Canvas();
canvas.Background = Brushes.Thistle;

Canvas clonedCanvas = ElementClone<Canvas>(canvas);
Brush clonedBrush = clonedCanvas.Background;

/// <summary>
/// Clones an element.
/// </summary>
public static T ElementClone<T>(T element)
{
    T clone = default(T);
    MemoryStream memStream = ElementToStream(element);
    clone = ElementFromStream<T>(memStream);
    return clone;
}

/// <summary>
/// Saves an element as MemoryStream.
/// </summary>
public static MemoryStream ElementToStream(object element)
{
    MemoryStream memStream = new MemoryStream();
    XamlWriter.Save(element, memStream);
    return memStream;
}

/// <summary>
/// Rebuilds an element from a MemoryStream.
/// </summary>
public static T ElementFromStream<T>(MemoryStream elementAsStream)
{
    object reconstructedElement = null;

    if (elementAsStream.CanRead)
    {
        elementAsStream.Seek(0, SeekOrigin.Begin);
        reconstructedElement = XamlReader.Load(elementAsStream);
        elementAsStream.Close();
    }

    return (T)reconstructedElement;
}
Canvas Canvas=newcanvas();
canvas.Background=画笔.Thistle;
Canvas clonedCanvas=ElementClone(画布);
Brush clonedBrush=clonedCanvas.Background;
/// 
///克隆一个元素。
/// 
公共静态T元素克隆(T元素)
{
T克隆=默认值(T);
MemoryStream memStream=元素到流(元素);
clone=ElementFromStream(memStream);
返回克隆;
}
/// 
///将元素另存为MemoryStream。
/// 
公共静态MemoryStream元素ToStream(对象元素)
{
MemoryStream memStream=新的MemoryStream();
Save(元素,memStream);
返回memStream;
}
/// 
///从MemoryStream重建元素。
/// 
公共静态T元素FromStream(MemoryStream元素AsStream)
{
对象重构元素=null;
if(elementAsStream.CanRead)
{
elementAsStream.Seek(0,SeekOrigin.Begin);
重构元素=XamlReader.Load(elementAsStream);
elementAsStream.Close();
}
返回(T)重建元素;
}

仅当不存在可写位图时。那么这就失败了。