2013-06-20 2 views
0

캔버스에 Silverlight 5에서 실행 취소 다시 실행 작업을 구현하려고합니다. 각 작업을 수행 한 후 캔버스를 스택에 저장하고 실행 취소 또는 다시 실행을 원할 경우 기존 캔버스를 스택에있는 캔버스로 대체합니다.기존 캔버스 변수로 캔버스 변수 초기화하기

현재 임시 변수와 현재 캔버스를 동일하게 만들 때 새로운 복사본이 만들어지지 않지만 두 캔버스 변수 모두 동일한 캔버스를 참조합니다. 즉, 한 캔버스에서 수행 된 변경이 다른 캔버스에 반영됩니다. 이것은 현재 캔버스를 변경 한 다음 임시 캔바스 (작업이 수행되기 전에 현재 캔버스와 동일 함)로 대체하기 위해 실행 취소 할 때 문제를 만듭니다. 임시 캔버스는 이전 캔버스 (즉, 현재 캔버스)에서 수행 된 변경 사항을 가져옵니다. .

어떻게 캔버스를 별도로 복사 할 수 있습니까 ?? 도와주세요.

나는 다음과 같이 초기화하고 있습니다 :

전체 .NET Framework의
Canvas temp = new Canvas(); 
temp = currentCanvas; 
+1

Canvas를 저장하면 안됩니다. 대신 Canvas의 * state *를 저장해야합니다.이 상태는 해당 상태의 추상 표현을 작성해야합니다. 따라서 애플리케이션을 모델과 뷰로 분리 할 수 ​​있습니다. – Clemens

답변

1

, 당신은 XamlReader 및 -writer 사용하여 복제를 만들 수 있습니다

public Canvas Clone(Canvas source) 
    { 
     var savedObj = XamlWriter.Save(source); 
     var reader = new StringReader(savedObj); 
     var xmlReader = XmlReader.Create(reader); 
     var canvas = (Canvas)XamlReader.Load(xmlReader); 
     return canvas; 
    } 

편집 : 실버는하지 않기 때문에 XamlWriter 및 Reader를 지원하는 경우 this generic class by Jim McCurdy을 사용하여 다음과 같이 sliverlight 객체를 복제 할 수 있습니다.

CloneObject.DeepClone<Canvas>(source,true); 
+0

답장을 보내 주셔서 감사합니다. 필요한 라이브러리를 지정해 주시겠습니까? – PythonIITD

+0

그냥'System.Windows.Markup' dll을 참조하십시오. – dsfgsho

+0

'XamlWriter'와'XamlReader.Create'는 여전히 인식되지 않습니다. 도움!! – PythonIITD