Atualizando a interface do usuário com o BackgroundWorker no WPF
No momento, estou escrevendo um aplicativo WPF 3.5 simples que utiliza o SharePoint COM para fazer chamadas para sites do SharePoint e gerar informações de Grupo e Usuário. Como esse processo demora um pouco, quero mostrar uma ProgressBar enquanto os grupos estão sendo gerados. O processo desejado é o seguinte:
O usuário insere o URL e clica no botão para buscar dados do site.ProgressBar inicia animaçãoGrupos são gerados e nomes são adicionados a um ListViewApós a conclusão, a animação ProgressBar terminaO problema que estou encontrando é que a interface do usuário nunca é atualizada. Nem o ProgressBar ou o ListView faz alterações. Se alguém tiver alguma idéia para ajudar com o código abaixo, seria muito apreciado.
private void GetGroupsAndUsersButton_Click(object sender, RoutedEventArgs e)
{
siteUrl = "";
if (SiteURLTextBox.Text.Length > 0)
{
FetchDataProgressBar.IsIndeterminate = true;
mWorker = new BackgroundWorker();
mWorker.DoWork += new DoWorkEventHandler(worker_DoWork);
mWorker.WorkerSupportsCancellation = true;
mWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
mWorker.RunWorkerAsync();
}
else
{
System.Windows.MessageBox.Show("Please enter a URL for the SharePoint site you wish to retrieve data");
}
}
private void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
siteUrl = SiteURLTextBox.Text;
GroupListView.ItemsSource = null;
try
{
using (SPSite site = new SPSite(siteUrl))
{
SPWeb web = site.OpenWeb();
SPGroupCollection collGroups = web.SiteGroups;
if (GroupNames == null)
GroupNames = new List<string>();
foreach (SPGroup oGroup in collGroups)
{
GroupListView.Items.Add(new ListViewItem() { Content = oGroup.Name });
}
foreach (ListViewItem item in GroupListView.Items)
{
item.MouseLeftButtonUp += item_MouseLeftButtonUp;
}
}
}
catch (Exception ex)
{
System.Windows.MessageBox.Show("Unable to locate a SharePoint site at: " + siteUrl);
}
}
private void worker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
FetchDataProgressBar.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
FetchDataProgressBar.IsIndeterminate = false;
}
));
}