当前位置: 首页 > 编程语言 > C#

在WPF中使用BackgroundWorker更新UI分享

时间:2023-04-10 19:11:35 C#

C#学习教程:使用BackgroundWorker更新WPF中的UI由于此过程需要一段时间,因此我希望在生成组时显示ProgressBar。所需的过程如下:用户输入url并单击按钮以获取站点数据。ProgressBar开始动画生成组并将名称添加到ListView完成后,ProgressBar动画结束我遇到的问题是UI从不更新。ProgressBar和ListView都不做任何更改。如果有人对下面的代码有任何帮助,我们将不胜感激。privatevoidGetGroupsAndUsersButton_Click(objectsender,RoutedEventArgse){siteUrl="";如果(SiteURLTextBox.Text.Length>0){FetchDataProgressBar.IsIndeterminate=true;mWorker=newBackgroundWorker();mWorker.DoWork+=newDoWorkEventHandler(worker_DoWork);mWorker.WorkerSupportsCancellation=true;mWorker.RunWorkerCompleted+=newRunWorkerCompletedEventHandler(worker_RunWorkerCompleted);mWorker.RunWorkerAsync();}else{System.Windows.MessageBox.Show("请输入您希望检索数据的SharePoint网站的URL");}}privatevoidworker_DoWork(objectsender,System.ComponentModel.DoWorkEventArgse){siteUrl=SiteURLTextBox.Text;GroupListView.ItemsSource=null;尝试{使用(SPSite站点=新SPSite(siteUrl)){SPWebweb=site.OpenWeb();SPGroupCollectioncollGroups=web.SiteGroups;if(GroupNames==null)GroupNames=newList();foreach(SPGroupoGroupincollGroups){GroupListView.Items.Add(newListViewItem(){内容=oGroup.Name});}foreach(GroupListView.Items中的ListViewItem项){item.MouseLeftButtonUp+=item_MouseLeftButtonUp;}}}catch(Exceptionex){System.Windows.MessageBox.Show("无法在以下位置找到SharePoint站点:"+siteUrl);}}privatevoidworker_RunWorkerCompleted(objectsender,System.ComponentModel.RunWorkerCompletedEventArgse){FetchDataProgressBar.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,newAction(delegate(){FetchDataProgressBar.IsIndeterminate=false;}));}首先,您需要支持ProgressChanged事件将BackgroundWorker初始化更新为:GroupListView.ItemSource=null;mWorker=newBackgroundWorker();mWorker.DoWork+=newDoWorkEventHandler(worker_DoWork);mWorker.WorkerSupportsCancellation=true;mWorker.WorkerReportsProgress=true;mWorker.ProgressChanged+=OnProgressChanged;mWorker.RunWorkerCompleted+=newRunWorkerCompletedEventHandler(worker_RunWorkerCompleted);mWorker.RunWorkerAsync(SiteURLTextBox.Text);之后,您必须添加一个OnProgressChanged处理程序:=(ListViewItem)e.UserState;toAdd.MouseLeftButtonUp+=item_MouseLeftButtonUp;GroupListView.Items.Add(toAdd);所以你必须改变你的DoWork:privatevoidworker_DoWork(objectsender,System.ComponentModel.DoWorkEventArgse){尝试{使用(SPSite站点=newSPSite((String)e.Argument)){SPWebweb=site.OpenWeb();SPGroupCollectioncollGroups=web.SiteGroups;if(GroupNames==null)GroupNames=newList();int添加=0;foreach(SPGroupoGroupincollGroups){添加++;ListViewItemtmp=newListViewItem(){Content=oGroup.Name};worker.ReportProgress((added*100)/collGroups.Count,tmp);}}}catch(Exceptionex){MessageBox.Show("无法在以下位置找到SharePoint站点:"+siteUrl);那是因为在那之后你不允许在DoWork上更改GUI,每个ListViewItem都被单独添加到ListView中。我还建议您将URL作为参数传递给RunWorkerAsync。编辑:向OnProgressChanged添加百分比。在您的DoWork方法中,您在后台线程的代码中操作WPF控件,这是您不应该做的。事实上,您应该会收到诸如“无法从另一个线程访问控制权”之类的错误。可能这些异常被catch-allerror处理程序捕获,即使MessageBox也无法在后台线程中运行。作为快速修复,您必须创建siteURL和collGroups类字段,将using块之前的所有内容移动到GetGroupsAndUsersButton_Click方法,并循环从第一个foreach循环到RunworkerCompleted事件的所有内容,因此访问控件的所有代码都是在UI线程中。您应该更改的另一件事是您不应在代码中创建ListViewItems,而应改用DataTemplate...但这与您的问题无关。你需要:mWorker.WorkerReportsProgress=true;mWorker.ProgressChanged+=newProgressChangedEventHandler(worker_ProgressChanged);然后在您的DoWork中,您需要调用:varworker=(BackgroundWorker)sender;worker.ReportProgress(progressAmount);很好的例子在这里:http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx以上是C#学习教程:在WPF中使用BackgroundWorker更新UI分享的所有内容,如果大家有什么问题有用,需要了解更多C#学习教程,希望大家多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: