Question

Je suis le traitement de gros fichiers après qu'ils sont sélectionnés par l'utilisateur. Mon code se présente comme suit:

if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

Cette bloque l'interface utilisateur alors j'ai essayé d'afficher un message de chargement avant de l'utilisateur sélectionné le fichier pour leur donner une indication visuelle que quelque chose se passait:

loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

Malheureusement, cela se fige encore complètement l'interface utilisateur alors que le fichier est en cours de traitement.

Ce que j'ai trouvé qui fonctionne parfaitement est si je tire un MessageBox juste après la sélection de fichiers. Je pense qu'il fait un appel de type « DoEvents » sous le capot pour obtenir l'événement chasse d'eau / éléments ui dans le moteur d'exécution.

loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
    MessageBox.Show("Sync!");
    // process really big file
}

Dans les cas comme celui-ci le grand fichier est toujours traité comme lentement, mais le message de chargement est affiché et l'interface utilisateur de l'écran se synched (je fais d'autres choses dans la vraie chose, comme montrant un curseur d'attente).

Question:

Silverlight n'a pas de fonctionnalité DoEvents. Y at-il un appel que je peux faire en plus MessageBox.Show d'avoir le même effet de synchroniser l'interface utilisateur et empêcher la OpenFileDialog de geler l'interface utilisateur?

Était-ce utile?

La solution

Utilisez un BackgroundWorker pour exécuter le calcul lourd en arrière-plan. Lorsque vous souhaitez notifier l'interface utilisateur que l'opération est terminée, l'événement RunWorkerCompleted de la classe mentionnée ci-dessus peut être utilisé. L'alternative à cela est d'utiliser un fil complètement séparé puis rappel à la thread d'interface utilisateur à l'aide Dispatcher.BeginInvoke (). Rappelez-vous que .NET dans un thread séparé vous ne pouvez pas accéder à tous les composants de l'interface graphique sans ce type de synchronisation.

Autres conseils

Utilisez la classe BackgroundWorker pour traiter votre dossier vraiment grand sur un thread d'arrière-plan? Voici un lien pour vous: Comment faire pour utiliser un BackgroundWorker

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top