2012-04-19 63 views
0

我想通過操作不透明度值將我的GUI上的Control設置爲透明。 因此,我初始化我的WPF的形​​式像構造一個BackgroundWorker使用BackgroundWorker調用WPF-GUI更改時的異常

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

在那之後,我的GUI等待一個事件,它是由另一個類

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

觸發事件處理我終於將啓動volumeWorker(BGW)來操縱GUI:

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

但在BackgroundWorkers的ChangeEvent,我得到了InvalidOperatio每次都有nException。每個人都有想法?

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.InvokeBeginInvoke方法。

+0

感謝您的幫助,它的工作原理:-) – Kooki 2012-05-22 13:18:25