Attualmente sto scrivendo una semplice applicazione WPF 3.5 che utilizza la COM di SharePoint per effettuare chiamate ai siti di SharePoint e generare informazioni su gruppi e utenti. Dato che questo processo richiede un po 'di tempo, voglio mostrare un ProgressBar mentre i gruppi vengono generati. Il processo desiderato è il seguente:Aggiornamento dell'interfaccia utente con BackgroundWorker in WPF
- L'utente inserisce il pulsante url e fa clic per recuperare i dati del sito.
- ProgressBar inizia l'animazione
- gruppi vengono generati e nomi si aggiungono a un ListView
- Al termine dell'animazione ProgressBar finisce
Il problema che sto funzionando in è che l'interfaccia utente non viene mai aggiornato. Né ProgressBar o ListView apporta alcuna modifica. Se qualcuno ha qualche idea per aiutare con il codice qui sotto sarebbe molto apprezzato.
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;
}
));
}
Grazie per la risposta. Purtroppo, nessun aggiornamento della GUI rimane. Inoltre, durante il debug, l'evento modificato non viene mai colpito. Si rompe immediatamente a worker_RunWorkerCompleted però (???) – pstricker
hai mai raggiunto il ciclo in try/catch? – Kooki
Dopo un po 'di tentativi sono riuscito a raggiungere il try/catch spostando il codice che fa riferimento agli elementi dell'interfaccia utente (GroupListView e SiteUrlTextBox) all'evento clic del pulsante, tuttavia ora sta generando un'eccezione all'avvio di ListViewItem: "Il thread chiamante deve essere STA, perché molti componenti dell'interfaccia utente richiedono questo. " – pstricker