2012-04-19 28 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

相关问题