L'animation d'une zone de texte.De premier plan dans WPF
Est-il de toute façon pour animer un TextBox.ForegroundProperty
?
<Color x:Key="NormalColor">#FF666666</Color>
<SolidColorBrush x:Key="NormalBrush" Color="{StaticResource NormalColor}" />
<Color x:Key="MouseOverColor">#FF666666</Color>
<SolidColorBrush x:Key="MouseOverBrush" Color="{StaticResource MouseOverColor}" />
<ControlTemplate x:Key="RegularTextBoxTemplate" TargetType="{x:Type TextBox}">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.1"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver">
<Storyboard>
<!-- storyboard to animating foreground here... -->
</Storyboard>
</VisualState>
</VisualStateGroup >
</VisualStateManager>
<ScrollViewer x:Name="PART_ContentHost"
BorderThickness="0"
IsTabStop="False"
Background="{x:Null}"/>
</Grid>
</ControlTemplate>
<Style x:Key="RegularTextBox" TargetType="{x:Type TextBox}">
<Setter Property="Foreground" Value="{StaticResource NormalBrush}"/>
<Setter Property="Template" Value="{StaticResource RegularTextBoxTemplate}"/>
</Style>
Mon essayé les story-boards sont:
<ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_ContentHost"
Storyboard.TargetProperty="(Foreground).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0" Value="{StaticResource MouseOverColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_ContentHost"
Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0" Value="{StaticResource MouseOverColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_ContentHost"
Storyboard.TargetProperty="(TextElement.Foreground).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0" Value="{StaticResource MouseOverColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="(Foreground).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0" Value="{StaticResource MouseOverColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="(TextBox.Foreground).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0" Value="{StaticResource MouseOverColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0" Value="{StaticResource MouseOverColor}" />
</ColorAnimationUsingKeyFrames>
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="(TextElement.Foreground).(SolidColorBrush.Color)">
<EasingColorKeyFrame KeyTime="0" Value="{StaticResource MouseOverColor}" />
</ColorAnimationUsingKeyFrames>
Aucune de ces travaux. Une idée? Est-il même possible?
- Vous essayez d'animer la
SolidColorBrush
dePART_ContentHost
, toutefois, il ne contient pas de pinceau. Avez-vous essayez d'attribuer une première brosse à dents? (Et où est-ce que votre contenu aller?) - Oui. Voir la mise à jour de question s'il vous plaît.
- Eh bien, je vois encore
<ScrollViewer x:Name="PART_ContentHost" ... Background="{x:Null}"/>
. Si vous essayez d'animer une propriété surnull
objet, à droite? - Non, je ne suis pas d'animer
Background
à tous. La propriété Target estForeground
- Oh, je vois. Vous essayez d'animer une propriété attachée
Textblock.Foreground
sur lePART_ContentHost
. Mais c'est toujours le même:PART_ContentHost
n'est pas tout, il est doncnull
. Pourriez-vous essayer d'assigner une valeur à elle? - Non, je ne suis pas d'animer
Textblock.Foreground
, mais j'ai essayé tous les story-boards mentionné dans la question; et oui, sur chaque scénario d'utilisation, j'ai corriger les valeurs de toutes les propriétés (y compris votre mentionnés). - Ok, je ne savais pas que ScrollViewer a ses propres biens
Foreground
. Mais néanmoins, cette propriété estnull
, car il n'est pas attribué pourPART_ContentHost
. Ainsi que de la propriété attachéeTextElement.Foreground
. Et pour le sans nomGrid
, trop.
Vous devez vous connecter pour publier un commentaire.
C'était plus problématique que ce que je pensais. Voici ma réponse:
Il est certainement possible - c'est ce que l'ColorAnimationXXX classes.
Votre code est très similaire à l'exemple de code ici, qui anime une couleur avec le ColorAnimation à la place. La propriété de l'exemple prend un Pinceau (tout comme la zone de texte.Au premier plan), qui est défini dans le code XAML et donné un nom de sorte qu'il peut être référencé facilement par l'animation.
Si dans votre cas, le code serait:
et:
Qui est très bien, en théorie, jusqu'à ce que je réalise qu'il n'a pas de travail dans un style. Alors que la
Background
propriété de la Grille dans le style est facilement animables, avec quelque chose comme:il est beaucoup plus difficile de trouver une propriété à animer qui aura une incidence sur l'avant-plan du texte. Au départ, j'ai essayé
TextElement.Foreground
, qui semble intuitif, et j'ai été en mesure de définir cette propriété sur la Grille et ScrollViewer niveaux qui je m'attendais à avoir un effet sur tous les objets enfants sous - notamment quel que soit l'objet, il est au niveau le plus bas qui contient le texte de la zone de texte. Mon hypothèse était que la zone de texte contenu serait défini en interne à un TextBlock, qui obéiraient à la valeur de l'avant-plan de la propriété attachée fixés sur elle. Il semble que mon hypothèse était erronée, et le contenu de la PART_ContentHost ScrollViewer est définie par la logique de contrôle à l'intérieur de zone de texte à un niveau inférieur de l'objet qui n'obéit pas tout de l'avant-plan des propriétés de dépendance dans l'arborescence de l'objet entre le haut niveau de la zone de texte et de lui-même.Le problème alors est de savoir comment définir la propriété Foreground de la zone de texte dans le style de la zone de texte étant de style. Pour les tests, j'ai essayé de régler cela avec un TwoWay TemplatedParent de liaison. Je crois que j'ai le PropertyPath à la Couleur de la SolidColorBrush droit, mais il ne fonctionne toujours pas comme la Couleur de la propriété a été apparemment immuable à ce point. Je crois que ce problème est documenté ici.
Sur le dessus du fait qu'il ne fonctionne pas, la définition de la propriété Foreground en interne ne semble pas droit comme externes, les consommateurs s'attendent à être en contrôle de la valeur de la propriété. Donc, étant donné que le premier plan d'une zone de texte n'obéissez pas à quoi que ce soit dans un style, je suis venu à la conclusion que la fonctionnalité est le mieux mis en œuvre avec une étude de zone de texte dans la zone de texte de style. L'extérieur de style contient le gestionnaire d'état et plus de la mise en page, puis l'intérieure de la zone de texte a son propre style et le modèle de contrôle qui est conçu pour afficher le texte bits. L'extérieur de style est en mesure de mettre au premier plan de la propriété de l'intérieur de la zone de texte, qui l'intérieure d'une volonté d'obéir, et de façon cruciale de l'extérieur, on peut définir cette valeur dans l'état gestionnaire.
Je serais intéressé à entendre les commentaires d'autres personnes sur cette approche, et s'il ya des problèmes avec elle que je n'ai pas considéré. Basé sur mes tentatives de résoudre le problème et snooping l'application qui en résulte, c'est la solution la plus simple que je peux voir à l'instant.
Foreground="{TemplateBinding Foreground}"
à l'intérieure de la zone de texte? Avec la version actuelle, il ne semble pas être un moyen pour l'utilisateur de définir le "normal" de couleur.Bien, merci à tous qui ont essayer de m'aider, j'ai trouvé ma réponse. Il semble que lorsque nous avons mis en
TextBox.Foreground
propriété d'une ressource, le storyboard ne peut l'animer. Ainsi, le style doit être quelque chose comme ceci:C'était le seul problème que j'ai eu. Mais il y a une note à retenir. Lorsque nous voulons cible basé sur un modèle de parent dans un storyboard, il n'est pas nécessaire de se lier à elle. Nous avons juste besoin de la quitter:
Cela fonctionne pour moi.
Ici est un exemple de travail.
(TextBox.Foreground).(SolidColorBrush.Color)
comme cible de la propriété. Il fonctionne très bienStaticResource
,DynamicResource
, et codé en dur valeurs (y compris les noms de couleurs et des codes hex). Il fonctionne avecDynamicResource
s; pourquoi? Je ne sais pas-je suis un newbie WPFer en fait. Mais le problème de votre solution, c'est que nous avons effectivement deuxTextBox
s. Et si nous voulons appliquer à d'autresVisualState
s, nous aurons une plus compliqué de l'onu-un code lisible.Vous pouvez lier
Storyboard.Target
à la TemplatedParent:Malheureusement, je n'ai pu obtenir que cela fonctionne lors de l'avant-plan de la brosse est pas jeu dans le style, et de la fixer directement sur l'élément de zone de texte:
Si elle est définie dans le style, le déclenchement de l'effet de Survol de l'état jette "Ne peut pas animer '(0).(1) " sur un immuable instance de l'objet." modifier: Cela se produit également si vous définissez la zone de texte de premier plan lorsqu'il est initialisé.