Хорошо, я только что столкнулся с чем-то, что действительно ловит меня вне защиты.
Я помогал такому же разработчику с несколькими несвязанными вопросами, и в его проекте он анимировал текст в некоторый TextBlock (s). Так, я вернулся к своему столу и воссоздал проект (для ответа на его вопросы), но я случайно использовал TextBox вместо TextBlock. Мой текст не анимировал вообще! (Много справки, я был!)
В конечном счете я выяснил, что его xaml использовал TextBlock, и мой использовал TextBox. То, что интересно, то, что Смешение не создавало ключевые кадры, когда я использовал TextBox. Так, я заставил это работать в использовании Смешения TextBlock (s) и затем изменил xaml вручную, преобразовав TextBlock (s) в TextBox. Когда я выполнил проект, я получил следующую ошибку:
InvalidOperationException: '(0)' Storyboard.TargetProperty path contains nonanimatable property 'Text'.
Ну, кажется, как будто Смешение было достаточно умно знать, что... и не генерируют ключевые кадры в анимации (это просто изменило бы значение непосредственно на TextBox). +1 для Смешения.
Так, вопрос стал: почему TextBox не. animatable текст? Обычный ответ - то, что особым свойством, которое Вы анимируете, не является DependencyProperty. Но, это не имеет место, TextBox. Текстом является DependencyProperty.
Так, теперь я изумлен! Почему Вы не можете анимировать TextBox. Текст?
Позвольте мне включать некоторый 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. Текст:
<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>
Попытка анимировать TextBox вручную ....
var timeline = new StringAnimationUsingKeyFrames();
timeline.KeyFrames.Add(new DiscreteStringKeyFrame("Goodbye", KeyTime.FromTimeSpan(new TimeSpan(0,0,1))));
textControl.BeginAnimation(TextBox.TextProperty, timeline);
. ..показывает более полезное сообщение об ошибке. Последняя строка завершается ошибкой со следующим ArgumentException
:
Свойство 'Text' не может быть анимировано в классе 'System.Windows.Controls.TextBox', поскольку флаг IsAnimationProhibited был установлен в UIPropertyMetadata, используемом для связывания недвижимость с классом.
Имя параметра: dp
В документации к UIPropertyMetadata.IsAnimationProhibited говорится:
В общем, свойства зависимостей по умолчанию, доступные в реализации фреймворка Windows Presentation Foundation (WPF) API можно анимировать. Вы можете установить для этого свойства значение true в метаданных вашего собственного настраиваемого свойства зависимостей, чтобы отключить на нем анимацию.
По-видимому, разработчики библиотеки WPF решили, что анимация свойства зависимости Text
TextBox не является хорошей идеей, и явно отключили ее.
Итак, это технический ответ на вопрос, почему это свойство нельзя анимировать. Почему они его отключили? Понятия не имею ...
PS: Быстрый взгляд на статические конструкторы TextBox
, TextBoxBase
и Control
с Reflector показывает, что Text
- единственное свойство зависимостей TextBox, которое нельзя анимировать.