アプリケーションで警告ウィンドウを作成しようとしています。ウィンドウは別のスレッドで実行する必要があり、特に失敗したオブジェクトを表すCanvasが含まれています。Canvasはすでにメインアプリケーションに存在します。必要なのは、警告ウィンドウに同じCanvasを表示することだけです。問題は、別のスレッドがオブジェクトを所有しているというエラーが発生することです。この方法を使用してディープコピーを実行しようとしましたが、うまくいきませんでした。私が見逃したものはありますか、それともCanvasや画像のコレクションをコピーする簡単な方法は本当にありません。あるいは、ディープコピーを実行してから、コピーされたオブジェクトのトレッドアフィニティを変更することは可能でしょうか?
誰かが以前にこの問題に遭遇したと思うべきですが、私のサーチングスキルは今回は関連する結果を私に与えませんでした。
前もって感謝します!-ruNury
編集1
private Canvas cloneCanvas()
{
Canvas testcanv = new Canvas();
Dispatcher.Invoke(new Action(delegate
{
var t = SomeViewModel.GetCanvasWithImages();
testcanv = CopyCanvas(t);
}));
return testcanv;
}
public static UIElement DeepCopy(UIElement element)
{
if (element != null)
{
var xaml = XamlWriter.Save(element);
var xamlString = new StringReader(xaml);
var xmlTextReader = new XmlTextReader(xamlString);
var deepCopyObject = (UIElement)XamlReader.Load(xmlTextReader);
return deepCopyObject;
}
return null;
}
private Canvas CopyCanvas(Canvas inputCanvas)
{
if (inputCanvas != null)
{
var outputCanvas = new Canvas();
foreach (UIElement child in inputCanvas.Children)
{
outputCanvas.Children.Add(DeepCopy(child));
}
return outputCanvas;
}
return null;
}