J'écris une application qui affiche l'image actuelle vue par une caméra et qui doit mettre à jour l'image affichée en temps réel, ou à proximité. Essentiellement, j'ai une caméra avec laquelle je peux capturer des images et j'ai besoin d'en capturer une toutes les secondes, disons une seconde, et d'afficher cette image sur l'écran. Actuellement, mon application dispose d'un contrôle Image et je capture une image BitmapImage à partir de la caméra et la définissant comme Image.Source. Mon problème est de mettre cela à jour continuellement. Malheureusement, je n'ai aucune expérience dans le traitement de quelque chose comme ça qui doit se mettre à jour pour toujours (ou jusqu'à ce que l'application que j'écris est fermée) et honnêtement, il semble y avoir très peu à aucun (que j'ai pu découvrir) web à propos de quelque chose comme ça dans WPF/C#. Je suppose que je vais devoir générer un thread pour effectuer la capture d'image, mais honnêtement, cela fait partie de mon problème - j'ai très peu d'expérience de travail avec les threads et je suis un peu confus sur la façon dont tout cela fonctionne. Merci beaucoup pour toute aide que vous pouvez fournir.Mise à jour du contrôle WPF en "temps réel"
Répondre
Pour que la liaison de données soit correctement mise à jour, vous pouvez utiliser INotifyPropertyChanged. Il suffit d'ajouter une référence à System.ComponentModel:
using System.ComponentModel;
hériteront Puis l'interface:
MyWindow : INotifyPropertyChanged
Ensuite, ajoutez le code suivant:
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
Enfin, ajoutez votre propriété que vous souhaitez lier à.
private BitmapImage currentImage;
public BitmapImage CurrentImage{get{return currentImage;} set{currentImage=value;NotifyPropertyChanged("CurrentImage");}}
Enfin, dans votre XAML, changer la liaison à {liaison currentImage} puis la fenêtre, définir le contexte de données auto source par rapport ... ce serait une propriété de la fenêtre:
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Cela devrait permettre à la liaison de fonctionner correctement. Faire des choses sur un thread séparé nécessiterait le répartiteur
Vous devriez lire sur la liaison de données dans WPF. WPF est criblé de motifs d'observateur pour mettre à jour l'affichage dès qu'un élément de données lié est modifié. Le fait que vous changiez Image.Source au lieu de changer le contenu de l'image est peut-être une source de confusion. Vous devez configurer le contrôle d'image dans XAML comme lié à un objet bitmap (probablement un champ de votre formulaire), puis modifier ou recharger l'objet bitmap selon les besoins. Le contrôle d'image lié aux données doit se redessiner automatiquement à chaque modification de l'objet bitmap. Comme vous mentionnez les threads d'arrière-plan, vous devez veiller à ne modifier les propriétés des éléments d'interface utilisateur (Image, Bitmap) que sur le thread d'interface utilisateur. Si vous recevez une nouvelle image dans le thread d'arrière-plan et souhaitez l'afficher dans l'interface utilisateur, vous devez synchroniser cette mise à jour avec le thread d'interface utilisateur. Voir Dispatcher .Invoke()
Comme c'est WPF, en utilisant le [Dispatcher] (http://msdn.microsoft.com/en-us/magazine/cc163328.aspx) est le moyen WPF pour synchroniser avec le thread UI. –
Peut-être que je ne comprends pas cela correctement ... il n'y a pas de propriété Content pour les contrôles Image, donc j'ai lié la Source à une Propriété du formulaire.J'ai essayé: Toutefois, le problème est que lorsque je définir par la suite this.CurrentImage par programme, il ne met jamais à jour le contrôle Image-I juste obtenir une image vide. Est-ce que je fais quelque chose de mal? Aussi, donc pour mettre à jour l'image chaque seconde (ou une certaine période de temps), conseillez-vous d'utiliser un thread d'arrière-plan pour modifier la propriété CurrentImage de formulaire ou autre chose? Merci encore! –
JToland
@JToland: Si vous liez une propriété que vous implémentez, vous devez également implémenter INotifyPropertyChanged sur la classe qui contient cette propriété afin que le mécanisme de liaison de données puisse découvrir que la propriété a changé et répondre en conséquence. Dans votre exemple, ce serait la classe de formulaire. Voir un exemple d'implémentation sur MSDN: http://msdn.microsoft.com/en-us/library/ms229614.aspx – dthorpe
Je suis dans une situation similaire, sauf que l'image est transmise à mon client WPF via WCF. J'ai donc réglé une minuterie et appelez le service WCf toutes les secondes. Mais quand j'assigne l'ImageSource à l'image bitmap, l'image scintille, comme dans je reçois un écran blanc, Image, écran blanc, image Comment le rendre continu?
Avez-vous essayé d'utiliser les méthodes décrites ci-dessus? Je sais que lorsque ma propriété CurrentImage est modifiée et lorsque j'utilise le notificateur comme indiqué ci-dessus, mon image change correctement sans aucune sorte de scintillement. Peut-être votre image «actuelle» est-elle effacée de la propriété ou de la mémoire, ou quoi que ce soit, avant que la «nouvelle» image ne soit réellement définie? – JToland
Non, je ne l'ai pas encore essayé, car je ne comprends pas complètement ce qu'il faut faire. Est-ce que je change ma fenêtre dont l'élément Image hérite de INotifyPropertyChanged? Pour que MainWIndow: Window change en MainWindow: INotifyPropertyChanged ?? Alors que diriez-vous des autres éléments dans la fenêtre? – xaria
En combinant cette réponse avec dthorpe ci-dessous fonctionne PARFAITEMENT! Merci beaucoup d'avoir rendu cela très clair et factice. c'était très apprécié. – JToland