2010-04-08 23 views
10

Tamam, beni gerçekten güvende tutan bir şeye girdim.Neden WMPF'de TextBox.Text animasyonu yapılamıyor?

Birkaç ilgisiz sorudan oluşan bir geliştiriciye yardımcı oluyordum ve projesinde bazı TextBlock (ler) 'e metinleri canlandırıyordu. Böylece, masama geri döndüm ve projeyi (sorularına cevap vermek için) yeniden oluşturdum, ancak TextBlock yerine TextBox'u yanlışlıkla kullandım. Metnim hiç hareketli değildi! (Bir çok yardım, öyleydi!)

Sonunda, onun xamlının TextBlock kullanıyor olduğunu ve benim de TextBox kullanıyor olduğunu anladım. İlginç olan, TextBox kullanırken Blend'in anahtar kareler oluşturmamasıydı. Bu yüzden, TextBlock (ler) i kullanarak Blend'de çalıştım ve sonra xaml'i TextBlock (lar) 'ı TextBox (es)' e dönüştürerek değiştirdim. Blend animasyon anahtar kareleri oluşturmak biliyorum ... ve kadar akıllı sanki sadece olurdu (

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

Gözüken o ki,: Ben projeyi ran, ben aşağıdaki hata var değeri doğrudan TextBox'ta değiştirin). Blend için +1.

Yani, soru neden oldu: Neden TextBox.Text animasyonu değil? Normal cevap, animasyon yaptığınız özelliğin bir DependencyProperty olmamasıdır. Ancak, bu durumda, TextBox.Text bir DependencyProperty olduğunu.

Şimdi şaşkınım! Neden TextBox.Text'i canlandırmıyorsunuz?


bana sorun göstermek için bazı xaml dahil edelim. Aşağıdaki xaml çalışır ... ama TextBlock kullanır.

<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 çalışmak ve kullanan değil aşağıdaki 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

İlginç ... buna hiç gerek yoktu, ama her zaman olacağını düşündüm. Umarım birisinin bir cevabı vardır. Üzgünüm, yardım edemem. –

+0

Bir göz attığınız için teşekkür ederiz. Kabul ediyorum ... bu biraz akademik bir sorudur ... ama canlandıramadığım bir DependencyProperty görmeyi çok merak ediyorum. – cplotts

cevap

28

elle TextBox animasyon çalışılıyor ....

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

... bir ortaya çıkarır daha kullanışlı hata mesajı.

'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

UIPropertyMetadata.IsAnimationProhibited dokümantasyonu diyor:

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.

Görünüşe göre, WPF kütüphane tasarımcıları bir TextBox Text depdendency özelliğini çizmekte olmadığını karar son satırı aşağıdaki ArgumentException ile başarısız iyi fikir ve açıkça engelli.

Bu nedenle, bu özelliğin neden animasyonlu olamayacağıyla ilgili teknik yanıtı. Neden devre dışı bıraktılar? Hiçbir fikrim yok ...

PS: Reflektör TextBox, TextBoxBase ve Control statik yapıcıları hızlı bir bakış Text animasyonlu olamaz sadece TextBox bağımlılık özelliği olduğunu ortaya koymaktadır.

+1

Harika cevap! Bu beni deli ediyordu. İlginçtir, TextBox için statik yapıcıda (Reflektör kullanılarak) özellik meta verilerini göremiyorum. Aslında, soruyu göndermeden önce böyle bir özellik olup olmadığını kontrol ettim. Text özelliği için özellik meta verilerinin nerede ayarlandığını merak ediyorum. – cplotts

+0

"TextBox" statik yapıcısı, 'FrameworkPropertyMetadata' yapıcısının bu aşırı yüklenmesini kullanır: http://msdn.microsoft.com/en-us/library/ms557303.aspx ve 'isAnimationProhibited' argümanına 'true' geçer. – Heinzi

+0

Ah, bunu özledim. Yine güzel iş. – cplotts