0

アプリケーションで警告ウィンドウを作成しようとしています。ウィンドウは別のスレッドで実行する必要があり、特に失敗したオブジェクトを表す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;
    }
4

1 に答える 1

0

シングルトンパターンを使用して、警告ウィンドウの1つのオブジェクトを維持できます。

キャンバスを警告ウィンドウに配置する場合は、Dispatcherを使用する必要があります。

Dispatcherは、メソッド呼び出しをUIスレッドにマーシャリングします。

何かのようなもの

  warningWindow.Dispatcher.Invoke(
      System.Windows.Threading.DispatcherPriority.Normal,
      new Action(
        delegate()
        {
          myCheckBox.IsChecked = true;
        }
    ));

警告ウィンドウがシングルトンインスタンスを介して利用できる場所

于 2012-05-09T13:53:56.880 に答える