2011-02-09 10 views
0

私はWPF 3.5を使用しています。WPFイメージをバックグラウンドワーカーに表示

私は、backgroundworker_DoWorkイベントでwhileループを使用しており、DSLRからのイメージを連続的にストリームします。最初は、ストリーミング映像はここでのPictureBox

<Grid> 
    <WindowsFormsHost VerticalAlignment="Top" Background="Transparent" Height="500"> 
     <wf:PictureBox x:Name="picLiveView" /> 
    </WindowsFormsHost> 
</Grid> 

に表示されます

は、背後にあるコードです:

 while (!liveViewExit) 
     { 
      try 
      { 
       if (picImage != null) 
        lock (mylock) 
        { 
         this.picLiveView.Image = (Image)picImage.Clone(); 
        } 
      } 
      catch 
      { 

      } 
     } 

これが正常に動作します。

私はWPFのImageコントロールにピクチャを変更しようとすると、私はWPFのイメージコントロールにBitmapImageのを割り当てられたときしかし、私はこのエラーを持っている:

{ "呼び出し元のスレッドが別のスレッドので、このオブジェクトにアクセスすることはできません"}

 MemoryStream ms = new MemoryStream(); 
     bmp.Save(ms, ImageFormat.Png); 
     ms.Position = 0; 
     BitmapImage bi = new BitmapImage(); 
     bi.BeginInit(); 
     bi.StreamSource = ms; 
     bi.EndInit(); 

     try 
     { 
      if (bi != null) 
      { 
       this.imageBox.Source = bi; 
      } 
     } 
     catch 
     { 

     } 

.NET 3.5 Picture Controlは.NET 3.5 WPF Imageコントロールでは動作しないのはなぜですか?

私はこのコードを試してみました:

BackgroundWorker bg = new BackgroundWorker(); 
Dispatcher disp = Dispatcher.CurrentDispatcher; 
bg.DoWork += (sender, e) => 
{ 
    // load your data 
    disp.Invoke(new Action(/* a method or lambda that do the assignment */)); 
} 
bg.RunWorkerCompleted += anotherMethodOrLambda; // optional 
bg.RunWorkerAsync(/*an argument object that will be visible in e.Argument*/); 

それはすべてのエラーはありませんが、画像が更新されません。 whileループは、アプリケーションが応答しないようにします。

+0

たぶん、このリンクは、「どのようにそれを動作させるために、あなたhttp://msdn.microsoft.com/en-us/magazine/cc163328.aspx – michele

答えて

2

メインスレッドでDispatcherオブジェクトをインスタンス化し、バックグラウンドワーカーでInvokeメソッドを呼び出す必要があります。ここで

はコードのサンプルです:

BackgroundWorker bg = new BackgroundWorker(); 
Dispatcher disp = Dispatcher.CurrentDispatcher; 
bg.DoWork += (sender, e) => 
{ 
    // load your data 
    disp.Invoke(new Action(/* a method or lambda that do the assignment */)); 
} 
bg.RunWorkerCompleted += anotherMethodOrLambda; // optional 
bg.RunWorkerAsync(/*an argument object that will be visible in e.Argument*/); 
+1

にこの答えを助けることができますWPFで?質問、それはなぜWinFormsのために働くのか答えません。その答えは、両方の技術におけるUIスレッド管理に対するさまざまなアプローチにあります。 @billy_flowが本当に後者に興味があるかどうかはわかりません。 – Anvaka

+0

@アンバカ:大丈夫、これらの違いの詳細な説明であなたの答えを待つつもりです。 – BertuPG

+0

@BertuPG:ナー、私はあなたをアップvoted :)。私は@billy_flowがWPF/WinFormsスレッディングモデルの違いではなく、WPFイメージで動作させる方法に本当に興味があったと思います。私たちが間違っている場合に備えてコメントを追加しました。 – Anvaka

関連する問題