Обновление пользовательского интерфейса с помощью BackgroundWorker в WPF
В настоящее время я пишу простое приложение WPF 3.5, которое использует SharePoint COM для звонков на сайты SharePoint и генерирования информации о группах и пользователях. Поскольку этот процесс занимает некоторое время, я хочу показать ProgressBar во время генерации групп. Желаемый процесс выглядит следующим образом:
Пользователь вводит URL и нажимает кнопку, чтобы получить данные сайта.ProgressBar начинает анимациюГруппы генерируются и имена добавляются в ListViewПо завершении анимация ProgressBar заканчиваетсяПроблема, с которой я сталкиваюсь, заключается в том, что пользовательский интерфейс никогда не обновляется. Ни ProgressBar, ни ListView не вносят никаких изменений. Если у кого-то есть какие-либо идеи, чтобы помочь с кодом ниже, будет принята с благодарностью.
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;
}
));
}