Utilisation Silverlight 4 & WPF 4, j'essaie de créer un style de bouton qui modifie la couleur de texte de tout texte contenu lorsque le bouton est Mouseover'd. Depuis que j'essaie de rendre cela compatible avec Silverlight & WPF, j'utilise le gestionnaire Visual State:
<Button> <TextBlock Text="Hello, World!" /> <!-- Same result with <TextBlock>Hello, World </TextBlock> --> </Button>
3 Réponses :
Ceci est un problème délicat. Le premier plan est une propriété du bouton transmis aux commandes que le présentateur de contenu crée. Parce que c'est une propriété de dépendance et non une propriété des commandes disponibles dans le modèle, il est difficile de l'animer à l'aide de Pure XAML.
MSDN a un couple d'échantillons sur la façon de changer de couleur de premier plan. Cependant, cela ne semble pas que vous voulez faire ce travail du code. (http://msdn.microsoft.com/en-us/library/system.windows.controls.button(vs.95).aspx)<
Le modèle par défaut du bouton vous retient. Comme vous l'avez remarqué, le bouton est un contrôle moins de contenu; ce qui signifie que le concepteur peut pousser un objet visuel aléatoire à l'intérieur. Être moins content de la propriété de premier plan pour être membre du modèle plutôt que le contrôle car il n'y a pas de composant de guarneet pour définir la couleur. C'est pourquoi il y a un présentateur de contenu à l'intérieur de celui-ci. P>Alors maintenant, vous avez deux options. 1. Facile mais non flexible (pure xaml), 2. Créez votre propre contrôle qui fait tout un bouton (nécessite du code et de nombreux tests) p>
Je vais implémenter # 1 pour vous. P >
Si vous modifiez le modèle du bouton et retirez le présentateur de contenu strong>, vous pouvez placer à l'intérieur de deux textes. Un avec la couleur normale, l'autre avec la couleur de votre souris sur la couleur. P> remarque comment les propriétés de texte des blocs de texte sont liées au contenu du contenu de la touche. Cela devient un problème s'il y a déjà besoin de se lier à autre chose que le texte. Textblocks ne peut tout simplement pas montrer quoi que ce soit que des valeurs alphanumériques. P> remarquez également que par défaut, j'ai effondré la visibilité sur le rougeblock. P> puis, dans mon Ça ressemble à un hack, et je ne voudrais probablement pas implémenter ce bouton dans les lots des endroits. Je voudrais faire mon propre bouton avec de bonnes dépendancesPropriétés à lier à. Un chacun pour la montureforefore et le texte. Je voudrais aussi vouloir cacher ou du moins jeter une exception si quelqu'un a essayé de mettre le contenu à tout autre que les valeurs ALPHANUMÉRIQUES. Cependant, la XAML serait la même, j'aurais des langues différentes pour différents états visuels. P> J'espère que cela vous aide. P> Passez une bonne journée. P> -Jeremiah p> p> Storyboard de Mousever VisualState < / code> Je peux animer le redbloc pour être visible et le blueblock à invisible: p>
Bonjour Jeremiah, c'est une solution vraiment belle et fonctionne bien dans une situation où le bouton ne contiendrait que du texte. Dans mon cas, j'aimerais avoir une solution plus générique, de sorte que tous les enfants de TextBlock obtiennent leurs couleurs de premier plan définies. (Toute chose intéressante à remarquer est que c'est comment Button fonctionne lorsque vous définissez son propriété de premier plan explicitement - tout child-textblocks reçoive la couleur appropriée, quelle que soit la pièce imbriquée dans les panneaux / contrôles à l'intérieur du contenu du bouton. J'ai détaillé la solution Je suis finalement arrivé à l'aide de propriétés attachées dans ce fil.
Ainsi, après plus d'autres pensées, la solution que j'ai finalement arrivée est d'ajouter une propriété connectée à l'élément de contenuPresenter dans le modèle de contrôle du bouton. La propriété attachée accepte une couleur et lorsqu'un ensemble examine l'arborescence visuelle du présentateur de contenu pour tous les blocs de texte et définit à son tour leurs propriétés de premier plan sur la valeur transmise. Cela pourrait évidemment être étendu / fait pour gérer des éléments supplémentaires, mais pour le moment, cela fonctionne maintenant. Pour ce dont j'ai besoin. et j'ai modifié le modèle comme: p>
C'est une bonne solution aussi. Je suis curieux d'utiliser les storyboards d'animation que vous seriez capables d'utiliser depuis que vous êtes lié à une statiqueResource.
Je devais utiliser un objet objectivant des caractères, par opposition à une coloranimation ou quelque chose de similaire.
Je l'utilise dans mon modèle et ça marche bien p> Vous devez insérer ce code dans la création de votre modèle de modèle
Mais j'utilise cela lorsque je mets du texte dans le contenu du bouton et si vous souhaitez ajouter d'autres contrôles à ce sujet, utilisez le style normal p> p>
Je suis surpris que cela achètimé à tous considérant que textelement n'a rien à voir avec TextBlock.