Voici l'affaire. Je peux créer un ListBox et le styler. Je peux éditer une copie du modèle de sorte que les états deviennent disponibles dans Expression Blend 3. Et je peux changer l'état de sorte que la couleur d'arrière-plan d'un élément de ligne soit modifiée quand elle est sélectionnée. Mais je ne peux pas changer la couleur de premier plan du texte à cause du ContentPresenter! Quelqu'un at-il un exemple XAML qui montre comment accomplir cette tâche apparemment facile?Comment puis-je utiliser VisualStateManager pour modifier la couleur du texte (premier plan) d'un ListBoxItem?
La réponse semble résider dans la suppression du ContentPresenter et son remplacement par un style ou un modèle de ListBoxItem, mais c'est là que je suis bloqué. Le ContentPresenter de ListBox fait référence à un autre modèle "{TemplateBinding Template}" - où est-ce? En outre, lorsque j'essaie de modifier ContentPresenter de quelque manière que ce soit, le panneau Etats est vide et il me reste un bourrelet de XAML. Heureusement, il y a CTRL-Z! Je pense vraiment que Microsoft doit repenser l'approche XAML ou faire de Blend un outil beaucoup plus complet. La façon dont cela devrait fonctionner est que je devrais pouvoir cliquer sur n'importe quel élément et en définir les états. Si j'essaie d'enfreindre les règles, Blend devrait me le dire et proposer un moyen de le réparer. Il ne sert à rien d'avoir le panneau États vide.
J'ai remplacé ContentPresenter par un DataTemplate personnalisé composé d'un contrôle utilisateur. Ce contrôle a un bloc de texte. Pour que VSM fonctionne, je dois d'une manière ou d'une autre obtenir une référence à l'instance de contrôle personnalisée réelle lorsque listbox déclenche l'événement SelectionChanged. C'est problématique. La méthode VSM.GoToState nécessite que l'instance lui soit transmise afin qu'elle puisse fonctionner. Je n'arrive pas à obtenir la référence. Des idées? Je suis d'accord que vous devriez être en mesure de «jouer avec le VSM» pour faire ce travail, mais devrait être le mot optimal, ici. Je dois encore voir quelqu'un le faire, cependant. – Wade
Maintenant, je peux capturer chaque instance DataTemplate personnalisée dans un tableau lors de l'événement Loaded du contrôle, puis utiliser des index numériques pour trouver l'instance basée sur la propriété SelectedIndex de la ListBox parent, mais cela est difficilement extensible. – Wade
Eh bien, j'ai trouvé un moyen de le faire sans utiliser VSM mais cela élimine la possibilité de jouer des animations. Je suis passé à Foreground du bloc de texte à {TemplateBinding Foreground}, puis définissez Foreground sur le ListBoxItem. Soupir .... – Wade