Winforms à la conversion WPF: BeginInvoke à quoi?
Voici mon ancien code de WinForms:
private void ValueChanged(double inValue1, double inValue2) {
//only manual mode for this driver, so that's easy.
if (ValueLabel.InvokeRequired) {
ValueLabel.Invoke(new MethodInvoker(delegate {
ValueLabel.Text = (inValue1* inValue2/ 1000).ToString("f1");
}
));
}
else {
ValueLabel.Text = (inValue1* inValue2/ 1000).ToString("f1");
}
}
Est-il un moyen facile de convertir ce WPF amical? Jusqu'à présent, j'ai:
private void KVPValueChanged(double inValue1, double inValue2) {
if (ValueLabel.Dispatcher.Thread == Thread.CurrentThread){
ValueLabel.Content = (inValue1* inValue2/ 1000).ToString("f1");
} else {
ValueLabel.Dispatcher.BeginInvoke(delegate {
ValueLabel.Content = (inValue1* inValue2/ 1000).ToString("f1");
});
}
}
Mais que la deuxième "délégué" échec de l'appel. Comment puis-je invoquer ce délégué? Je suppose que je peux aller à travers l'ensemble de la fabrication d'un délégué de la méthode, de faire un exemple de la méthode du délégué, en invoquant ce cas particulier, etc, mais je pensais que le point de l'ensemble de ces délégués anonymes était d'éviter que des tracas. De Plus, mon vieux winforms code a d'abord mise en œuvre dans tous les sens, donc je voudrais vraiment éviter d'avoir à dé-anonymiser tous mes délégués.
Edit: je peux essayer d'utiliser la MethodInvoker, comme je l'étais avant, mais alors le compilateur devient confus. MethodInvoker est la partie du Système.De Windows.Formes, donc, en utilisant cette approche ne fonctionne pas. Comme dans:
private void ValueChanged(double inValue1, double inValue2) {
if (ValueLabel.Dispatcher.Thread == Thread.CurrentThread) {
ValueLabel.Content = (inValue1* inValue2/ 1000).ToString("f1");
}
else {
ValueLabel.Dispatcher.BeginInvoke(new System.Windows.Forms.MethodInvoker(delegate {
ValueLabel.Content = (inValue1* inValue2/ 1000).ToString("f1");
}));
}
}
Que l'utilisation de MethodInvoker n'est pas casher. Est-il distinct de la mise en œuvre, ou de quelque autre façon à utiliser le même comportement?
source d'informationauteur mmr
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez besoin de changer la signature du délégué:
Aussi, regardez vers le haut en utilisant le composant BackgroundWorker. Pas seulement pour wpf, mais aussi pour la winform des opérations asynchrones.
Système.De Windows.Les formulaires.MethodInvoker est tout simplement un Délégué qui ne prennent aucun paramètre et renvoie void. Dans WPF, vous pouvez simplement le remplacer par Système.Action. Il y a aussi d'autres intégrée Délégués que accepter les paramètresles valeurs de retourou les deux.
Dans votre cas,
devient