2012-04-19 7 views
0

不透明度の値を操作してGUI上のコントロールを透過的に設定したいと思います。イベント上の別のクラスBackgroundWorkerでWPF-GUI-Changesを呼び出す際の例外

soundController = new SoundController(); 
soundController.VolumeChanged +=new SoundController.VolumeChangedEventHandler(VolumeChanged); 

によってトリガされたイベントのために、私のGUIの待機をその後

volumeWorker = new BackgroundWorker(); 
volumeWorker.DoWork += new DoWorkEventHandler(VolumeBarDoWork); 
volumeWorker.ProgressChanged += new ProgressChangedEventHandler(VolumeBarChanged); 
volumeWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(VolumeBarCompleted); 
volumeWorker.WorkerReportsProgress = true; 

:したがって 、私は私のようなWPFフォームのコンストラクタにBackgroundWorker初期化ハンドラ私は最終的にGUIを操作するためにvolumeWorker(BGW)を開始します:

private void VolumeChanged(float pVolume) 
{ 
    Logger.InfoWrite("Event raised ## New volume : {0}", pVolume); 
    volumeWorker.RunWorkerAsync(); 
} 

しかしBackgroundWorkers ChangeEventの上に、私はInvalidOperatioを得ました毎回誰かにアイデアがあったのですか?

private void VolumeBarDoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 
    Logger.InfoWrite("Worker"); 
    for(int _opacity = 99 ; _opacity >= 0 ; _opacity--) 
    { 
     Logger.InfoWrite("Start on {0}", _opacity); 
     worker.ReportProgress(_opacity); 
     System.Threading.Thread.Sleep(20) 
    } 
    e.Result = e.Argument; 
} 

private void VolumeBarChanged(object sender, ProgressChangedEventArgs e) 
{ 
    this.volumeBar.Opacity -= 0.01f; 
    Logger.InfoWrite("Changed opacity to : {0} on {1}", this.volumeBar.Opacity, e.ProgressPercentage); 
} 

private void VolumeBarCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    Logger.InfoWrite("Completed"); 
    this.volumeBar.Opacity = 0.0f; 
} 

答えて

1

UIコントロールがUIスレッドで作成されるため、UIスレッドの外で直接UIを変更することはできません。代わりにDispatcher.InvokeまたはBeginInvokeメソッドを使用してください。

+0

私を助けてくれてありがとう、それは働いた:-) – Kooki

関連する問題