2010-04-08 3 views
10

Ok, je viens de tomber sur quelque chose qui me prend vraiment au dépourvu. J'aidais un collègue développeur avec quelques questions sans rapport et dans son projet il animait du texte dans certains TextBlock (s). Donc, je suis retourné à mon bureau et recréé le projet (afin de répondre à ses questions), mais j'ai accidentellement utilisé TextBox au lieu de TextBlock. Mon texte n'animait pas du tout! (Beaucoup d'aide, j'étais!)Pourquoi TextBox.Text dans WPF n'est-il pas animé?

Finalement, j'ai compris que son xaml utilisait TextBlock et le mien utilisait TextBox. Ce qui est intéressant, c'est que Blend ne créait pas d'images clés lorsque j'utilisais TextBox. Donc, je l'ai eu à travailler dans Blend en utilisant TextBlock (s), puis modifié le xaml à la main, en convertissant le TextBlock (s) en TextBox (es). Quand je courais le projet, je suis l'erreur suivante:

InvalidOperationException: '(0)' Storyboard.TargetProperty path contains nonanimatable property 'Text'.

Eh bien, il semble que si Blend était assez intelligent pour savoir que ... et ne pas générer les images clés dans l'animation (il serait juste modifiez la valeur directement sur le TextBox). +1 pour le mélange. Donc, la question est devenue: pourquoi TextBox.Text n'est-il pas animable? La réponse habituelle est que la propriété particulière que vous animez n'est pas DependencyProperty. Mais, ce n'est pas le cas, TextBox.Text est un DependencyProperty.

Alors, maintenant je suis éberlué! Pourquoi ne pouvez-vous pas animer TextBox.Text?


Permettez-moi inclure quelques XAML pour illustrer le problème. Le xaml suivant fonctionne ... mais utilise TextBlock (s).

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="TextBoxTextQuestion.MainWindow" 
    x:Name="Window" 
    Title="MainWindow" 
    Width="640" 
    Height="480" 
> 
    <Window.Resources> 
     <Storyboard x:Key="animateTextStoryboard"> 
      <StringAnimationUsingKeyFrames Storyboard.TargetProperty="(TextBlock.Text)" Storyboard.TargetName="textControl"> 
       <DiscreteStringKeyFrame KeyTime="0:0:1" Value="Goodbye"/> 
      </StringAnimationUsingKeyFrames> 
     </Storyboard> 
    </Window.Resources> 
    <Window.Triggers> 
     <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
      <BeginStoryboard Storyboard="{StaticResource animateTextStoryboard}"/> 
     </EventTrigger> 
    </Window.Triggers> 
    <Grid x:Name="LayoutRoot"> 
     <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center"> 
      <TextBlock x:Name="textControl" Text="Hello" FontFamily="Calibri" FontSize="32"/> 
      <TextBlock Text="World!" Margin="0,25,0,0" FontFamily="Calibri" FontSize="32"/> 
     </StackPanel> 
    </Grid> 
</Window> 

Le XAML suivant ne fonctionne pas et utilise TextBox.Text:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="TextBoxTextQuestion.MainWindow" 
    x:Name="Window" 
    Title="MainWindow" 
    Width="640" 
    Height="480" 
> 
    <Window.Resources> 
     <Storyboard x:Key="animateTextStoryboard"> 
      <StringAnimationUsingKeyFrames Storyboard.TargetProperty="(TextBox.Text)" Storyboard.TargetName="textControl"> 
       <DiscreteStringKeyFrame KeyTime="0:0:1" Value="Goodbye"/> 
      </StringAnimationUsingKeyFrames> 
     </Storyboard> 
    </Window.Resources> 
    <Window.Triggers> 
     <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
      <BeginStoryboard Storyboard="{StaticResource animateTextStoryboard}"/> 
     </EventTrigger> 
    </Window.Triggers> 
    <Grid x:Name="LayoutRoot"> 
     <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center"> 
      <TextBox x:Name="textControl" Text="Hello" FontFamily="Calibri" FontSize="32"/> 
      <TextBox Text="World!" Margin="0,25,0,0" FontFamily="Calibri" FontSize="32"/> 
     </StackPanel> 
    </Grid> 
</Window> 
+0

Intéressant ... n'a jamais eu besoin de cela, mais toujours présumé qu'il le serait. J'espère que quelqu'un a une réponse. Désolé je ne peux pas aider. –

+0

Merci d'avoir jeté un oeil. J'avoue ... c'est un peu une question académique ... mais je suis très curieux de voir une DependencyProperty que je ne peux pas animer. – cplotts

Répondre

28

Essayer d'animer la zone de texte manuellement ....

var timeline = new StringAnimationUsingKeyFrames(); 
timeline.KeyFrames.Add(new DiscreteStringKeyFrame("Goodbye", KeyTime.FromTimeSpan(new TimeSpan(0,0,1)))); 
textControl.BeginAnimation(TextBox.TextProperty, timeline); 

... révèle une message d'erreur plus utile. La dernière ligne échoue avec ce qui suit ArgumentException:

'Text' property is not animatable on 'System.Windows.Controls.TextBox' class because the IsAnimationProhibited flag has been set on the UIPropertyMetadata used to associate the property with the class.
Parameter name: dp

La documentation de UIPropertyMetadata.IsAnimationProhibited dit:

In general, the default dependency properties available in the Windows Presentation Foundation (WPF) framework implementation APIs can be animated. You might set this property to true in the metadata of your own custom dependency property to disable animations on it.

Apparemment, les concepteurs de la bibliothèque WPF a décidé que animant la propriété Text de depdendency d'une zone de texte n'est pas un bonne idée et explicitement désactivé.

Donc, c'est le technique répondre pour expliquer pourquoi cette propriété ne peut pas être animée. Pourquoi l'ont-ils désactivé? Je ne sais pas ...

PS: Un regard rapide sur les constructeurs statiques de TextBox, TextBoxBase et Control avec réflecteur révèle que Text est la seule propriété de dépendance TextBox qui ne peut pas être animé.

+1

Bonne réponse! Cela me rendait fou. Fait intéressant, je ne vois pas que les métadonnées de propriété définies dans le constructeur statique (en utilisant Reflector) pour TextBox. En fait, j'ai vérifié toutes les propriétés comme ça avant de poster la question. Je me demande où les métadonnées de cette propriété sont définies pour la propriété Text. – cplotts

+0

Le constructeur statique de TextBox utilise cette surcharge du constructeur 'FrameworkPropertyMetadata': http://msdn.microsoft.com/en-us/library/ms557303.aspx et transmet' true' pour l'argument 'isAnimationProhibited'. – Heinzi

+0

Ah, j'ai raté ça. Encore une fois, bon travail. – cplotts

Questions connexes