Question

Je dois définir une propriété de dépendance sur un contrôle (Slider.Value) dans mon code sans que cela ne déclenche un événement ValueChanged (puisque j'ai défini la valeur, pas l'utilisateur). Quelle est la meilleure façon de gérer cette situation dans WPF?

Par souci de clarté, ce que j'essaie de faire est de relier les curseurs WPF à un contrôle utilisateur WinForms. Actuellement, dans mon application, j'ai un gestionnaire d'événements ValueChanged qui transmet la valeur du curseur au contrôle WinForms via un appel de méthode. Le contrôle WinForms (qui recouvre en réalité une fenêtre OpenGL native) doit pouvoir modifier dynamiquement le curseur en fonction de ses calculs internes. Pour ce faire, j'utilise une abstraction d'un curseur (ISlider), j'instancie une version WPF de ce curseur dans mon application et je passe un descripteur à sa base pour le contrôle WinForms via une propriété .NET sur le contrôle utilisateur WinForms. Tout cela fonctionne actuellement. Lorsque la logique interne décide que le curseur doit changer, il appelle ISlider :: SetPos (), qui modifie ensuite le curseur WPF, ce qui déclenche ensuite un événement ValueChanged sur le curseur et le gestionnaire. pour cet événement, extrait la position du curseur et la transmet au contrôle WinForms qui a créé l'événement. Les suggestions de Ligaz et d'Alan Le semblent convenir, mais je ne suis tout simplement pas sûr de pouvoir y parvenir de la meilleure façon possible.

Était-ce utile?

La solution

Voici une solution de contournement / piratage simple. Ajoutez un booléen pour savoir si vous avez modifié le paramètre, par exemple, "IsChangedByMe". Lorsque vous modifiez la propriété de dépendance dans le code, définissez le bool sur true. Dans l'événement ValueChanged, si IsChangedByMe est true, ne faites rien.

Autres conseils

Êtes-vous sûr de vouloir vraiment faire ça? Si une partie de l'interface utilisateur est liée à cette propriété et que vous autorisez la modification de la valeur sans déclencher l'événement ValueChanged, votre interface utilisateur ne sera plus synchronisée avec les données.

Dans le cas de votre curseur, imaginez que l'utilisateur le place à 75%. Maintenant, votre code le modifie à 10% en arrière-plan, mais supprime la notification de modification. Il semble toujours à l'écran qu'il est à 75% (puisqu'il n'a pas été annoncé que cela a changé), mais il est utilisé à 10% par le code en cours d'exécution. Cela ressemble à une recette pour la confusion.

Une solution possible consiste à dériver de Slider et à remplacer OnValueChanged (...) . Si vous ne souhaitez pas déclencher l'événement, vous ne devez rien faire, sinon vous devez appeler l'implémentation de base.

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