Aktualizowanie interfejsu użytkownika za pomocą BackgroundWorker w WPF
Obecnie piszę prostą aplikację WPF 3.5, która wykorzystuje SharePoint COM do wykonywania połączeń z witrynami SharePoint i generowania informacji o grupach i użytkownikach. Ponieważ proces ten trwa chwilę, chcę pokazać pasek postępu podczas generowania grup. Pożądany proces jest następujący:
Użytkownik wprowadza adres URL i przycisk kliknięcia, aby pobrać dane witryny.ProgressBar rozpoczyna animacjęGrupy są generowane, a nazwy są dodawane do ListViewPo zakończeniu animacja ProgressBar się kończyProblem, w którym się znajduję, polega na tym, że interfejs użytkownika nigdy nie jest aktualizowany. Ani ProgressBar ani ListView nie wprowadza żadnych zmian. Jeśli ktoś ma jakieś pomysły na pomoc z poniższym kodem, byłby bardzo mile widziany.
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;
}
));
}