2011-01-25 10 views
2

私はWPFのコンポーネントを持っていましたが、このコンポーネントはボーダーを使用し、ボーダーのBackgroundプロパティを使用してコンポーネント全体の背景色を変更します。他のスレッドからボーダープロパティを変更すると例外が発生する

問題は、2つの異なる色の間で、タイマーで代替を試みると、invalidOperationExceptionがスローされます。 "呼び出し元のスレッドは、別のスレッドが所有しているため、このオブジェクトにアクセスできません"。タイマーメソッドでは、私はDispatcherオブジェクトの境界線のプロパティを変更するコードを配置します。

  mainBorder.Dispatcher.BeginInvoke((ThreadStart)delegate() 
      { 
       mainBorder.BorderBrush = myBrush; 
       mainBorder.Background = myBrush; 
      }, null); 

例外はスローされ、私は間違って何を理解していない!たとえば、同じ時間に私はそれを行うコード

lbHolderServico.Dispatcher.BeginInvoke((ThreadStart)delegate() 
{ 
    lbHolderServico.Foreground = new SolidColorBrush(HoldLabelsFontColor); 
}, null); 

ラベルのフォントの色を変更するとすべて正常に動作します。

おかげで、あなたが作成していることを確認してくださいし、同様に、UIスレッド上でmyBrushの値を設定

答えて

1

代替資源としてブラシ/アニメーションを定義して起動することです必要に応じてブラシを割り当てることができます。

3

について。

mainBorderは境界であり、スレッド親和性を有する。しかし、Brushは、DispatcherObjectから派生したスレッドアフィニティも持っています。

(あなたが他の場所で作成したものを使用していない、UIスレッドで新しいブラシを作成しているので、あなたの第二の例は動作します...)

+0

オフコース! UIスレッドでmyBrushを作成してくれてありがとう。 – mastervv

+1

'' Brush'を 'フリーズ'します。 – user7116

+0

@sixlettervariables:もちろん、それは働くでしょう - OPはブラシの値を変更しようとしていません。 –

関連する問題