2016-04-22 2 views
0

Добрый день. Я пытаюсь создать графический редактор (например, Paint). Поэтому мне нужно создать кнопки «Отменить» и «Повторить». Если я копирую Childrens of canvas, это занимает слишком много времени, когда Canvas.Children состоит из множества элементов. Как реализовать действия отмены и повтора?Как клонировать холст в WPF

ответ

0

Я никогда не использовал 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; 
} 
+0

Только если не WriteableBitmap присутствует. Тогда это терпит неудачу. – AeroClassics

Смежные вопросы