Почему TextBox не. Текст в animatable WPF?

Хорошо, я только что столкнулся с чем-то, что действительно ловит меня вне защиты.

Я помогал такому же разработчику с несколькими несвязанными вопросами, и в его проекте он анимировал текст в некоторый 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>
10
задан cplotts 8 April 2010 в 21:47
поделиться

1 ответ

Попытка анимировать 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, которое нельзя анимировать.

28
ответ дан 3 December 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: