2010-04-08 30 views
10

Ok, tôi vừa chạy vào thứ gì đó thực sự khiến tôi mất cảnh giác.Tại sao TextBox.Text không hoạt động trong WPF?

Tôi đã trợ giúp một nhà phát triển đồng nghiệp với một vài câu hỏi không liên quan và trong dự án của anh ấy, anh ấy đang làm hoạt hình văn bản vào một số TextBlock (s). Vì vậy, tôi quay lại bàn làm việc của mình và tái tạo dự án (để trả lời các câu hỏi của mình), nhưng tôi đã vô tình sử dụng TextBox thay vì TextBlock. Văn bản của tôi không hoạt hình chút nào! (Rất nhiều trợ giúp, tôi đã!)

Cuối cùng, tôi đã tìm ra rằng xaml của anh ấy đang sử dụng TextBlock và tôi đang sử dụng TextBox. Điều thú vị là Blend không tạo khung chính khi tôi đang sử dụng TextBox. Vì vậy, tôi đã nhận nó để làm việc trong Blend bằng cách sử dụng TextBlock (s) và sau đó sửa đổi xaml bằng tay, chuyển đổi TextBlock (s) vào TextBox (es). Khi tôi chạy dự án, tôi nhận được lỗi sau:

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

Vâng, nó có vẻ như nếu Blend là đủ thông minh để biết rằng ... và không tạo ra các khung chính trong phim hoạt hình (nó sẽ chỉ sửa đổi giá trị trực tiếp trên TextBox). 1 cho Blend.

Vì vậy, câu hỏi đã trở thành: tại sao TextBox không tiếp tục hoạt ảnh? Câu trả lời thông thường là thuộc tính cụ thể mà bạn đang tạo hoạt ảnh không phải là DependencyProperty. Nhưng, đây không phải là trường hợp, TextBox.Text một DependencyProperty.

Vì vậy, bây giờ tôi hoang mang! Tại sao bạn không thể tạo hiệu ứng TextBox.Text?


Hãy để tôi bao gồm một số xaml để minh họa sự cố. Các xaml sau hoạt động ... nhưng sử dụng 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> 

Sau đây XAML không hoạt động và sử dụng 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

Thú vị ... không bao giờ có nhu cầu về điều này, nhưng luôn được cho là như vậy. Hy vọng rằng ai đó có câu trả lời. Xin lỗi tôi không thể giúp. –

+0

Cảm ơn bạn đã xem qua. Tôi thừa nhận ... nó là một chút của một câu hỏi học tập ... nhưng tôi rất tò mò muốn thấy một DependencyProperty tôi không thể animate. – cplotts

Trả lời

28

Đang cố gắng để animate TextBox bằng tay ....

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

... cho thấy một thông báo lỗi hữu ích hơn. Dòng cuối cùng không thành công với những điều sau đây 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

Các tài liệu của UIPropertyMetadata.IsAnimationProhibited nói:

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.

Rõ ràng, các nhà thiết kế của thư viện WPF quyết định rằng hiệu ứng động tài sản Text depdendency của một TextBox không phải là một ý tưởng hay và vô hiệu hóa nó một cách rõ ràng.

Vì vậy, đó là câu trả lời cho câu hỏi kỹ thuật về lý do tại sao thuộc tính này không thể hoạt ảnh. Tại sao họ vô hiệu hóa nó? Tôi không có ý tưởng ...

PS: Một cái nhìn lướt qua các nhà thầu tĩnh của TextBox, TextBoxBaseControl với Reflector cho thấy Text chỉ là tài sản phụ thuộc TextBox mà không thể được hoạt hình.

+1

Câu trả lời hay! Điều này đã khiến tôi khốn khổ. Điều thú vị là tôi không thấy siêu dữ liệu thuộc tính đó được đặt trong hàm tạo tĩnh (sử dụng Trình phản xạ) cho TextBox. Trong thực tế, tôi đã kiểm tra cho bất kỳ tài sản như thế trước khi đăng câu hỏi. Tôi tự hỏi đâu là siêu dữ liệu thuộc tính được đặt cho thuộc tính Văn bản. – cplotts

+0

Hàm tạo tĩnh của 'TextBox' sử dụng quá tải này của hàm tạo' FrameworkPropertyMetadata': http://msdn.microsoft.com/en-us/library/ms557303.aspx và chuyển 'true' cho đối số' isAnimationProhibited'. – Heinzi

+0

Ah, tôi đã bỏ lỡ điều đó. Một lần nữa, công việc tốt đẹp. – cplotts

Các vấn đề liên quan