Хорошо, я только что столкнулся с чем-то, что действительно застало меня врасплох.
Я помогал коллеге-разработчику с парой несвязанных вопросов, и в его проекте он анимировал текст в несколько текстовых блоков. Итак, я вернулся к своему столу и воссоздал проект (чтобы ответить на его вопросы), но случайно использовал TextBox вместо TextBlock. Мой текст вообще не анимировался! (Большая помощь, я был!)
В конце концов я понял, что его xaml использует TextBlock, а мой использует TextBox. Что интересно, Blend не создавал ключевые кадры, когда я использовал TextBox. Итак, я заставил его работать в Blend, используя TextBlock (s), а затем вручную изменил xaml, преобразовав TextBlock (s) в TextBox (es). Когда я запустил проект, я получил следующую ошибку:
InvalidOperationException: '(0)' Storyboard.TargetProperty path contains nonanimatable property 'Text'.
Ну, похоже, что Blend был достаточно умен, чтобы знать это... и не генерировать ключевые кадры в анимации (он просто изменил бы значение непосредственно в TextBox). +1 за смесь.
Итак, возник вопрос: почему TextBox.Text нельзя анимировать? Обычный ответ заключается в том, что конкретное свойство, которое вы анимируете, не является DependencyProperty. Но это не так, TextBox.Text является DependencyProperty.
Итак, теперь я в растерянности! Почему нельзя анимировать TextBox.Text?
Позвольте мне включить некоторый xaml, чтобы проиллюстрировать проблему. Следующий xaml работает... но использует 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>
Следующий код xaml не работает и использует 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>