Obecnie piszę prostą aplikację WPF 3.5, która wykorzystuje komputer SharePoint do nawiązywania połączeń z witrynami programu SharePoint i generowania informacji o grupach i użytkownikach. Ponieważ ten proces trwa chwilę, chcę pokazać pasek ProgressBar podczas generowania grup. Żądany proces jest następujący:Aktualizowanie interfejsu użytkownika przy użyciu usługi BackgroundWorker w pakiecie WPF
- Użytkownik wprowadza przycisk url i kliknięć w celu pobrania danych witryny.
- ProgressBar zaczyna animację
- Grupy są generowane i nazwy są dodawane do ListView
- Upon animacji ukończenie ProgressBar kończy
Problem używam na to, że interfejs nie jest aktualizowana. Ani ProgressBar, ani ListView nie dokonują żadnych zmian. Jeśli ktoś ma jakieś pomysły, aby pomóc w poniższym kodzie, byłoby to bardzo cenne.
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;
}
));
}
Dziękuję za odpowiedź. Niestety, wciąż nie ma aktualizacji GUI. Ponadto, podczas debugowania, zmiana zdarzenia nigdy nie zostaje trafiona. Natychmiast pęka na worker_RunWorkerCompleted chociaż (???) – pstricker
czy kiedykolwiek dotarłeś do pętli do try/catch? – Kooki
Po małym majsterkowaniu udało mi się dotrzeć do try/catch, przesuwając kod odwołujący się do elementów UI (GroupListView i SiteUrlTextBox) do zdarzenia click button, ale teraz rzuca wyjątek podczas inicjowania ListViewItem: "Wywołujący wątek musi być STA, ponieważ wiele komponentów interfejsu użytkownika tego wymaga. " – pstricker