2011-02-03 29 views
6

Tôi đang cố tạo hiệu ứng động 'Kiểu' bằng cách sử dụng ObjectAnimationUsingKeyFrames. Khi tôi chạy mẫu bên dưới, tôi chỉ thấy cửa sổ trống và không có bất kỳ ngoại lệ nào.Thuộc tính Animate 'Style' của Kiểm soát bằng cách sử dụng ObjectAnimationUsingKeyFrames trong WPF

Hầu như cùng một mẫu hoạt động trong Silverlight. Trong WPF nó hoạt động quá, nếu tôi gán thuộc tính 'Style' của điều khiển trực tiếp. Có ai biết nếu nó có thể animate 'Style' tài sản trong WPF?

Rất cám ơn.

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:this="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="350" Width="525" 
    > 
<Window.Resources> 
    <ResourceDictionary> 

     <Style x:Key="TestStyle" TargetType="Control"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <Canvas x:Name="Rectangle"> 
          <Rectangle Width="200" Height="150" Fill="Red"/> 
         </Canvas> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ResourceDictionary> 
</Window.Resources> 
<Canvas> 
    <Canvas.Triggers> 
     <EventTrigger RoutedEvent="Canvas.Loaded"> 
      <BeginStoryboard> 
       <Storyboard> 
        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Target" Storyboard.TargetProperty="Style" > 
         <DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="{StaticResource ResourceKey=TestStyle}" /> 
        </ObjectAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Canvas.Triggers> 

    <Canvas.Children> 
     <ContentControl x:Name="Target"/> 
    </Canvas.Children> 
</Canvas> 

+0

thử DynamicResource thay vì StaticResource. – Bijan

Trả lời

1

Khi ObjectAnimationUsingKeyFrames cố gắng để animate đến một giá trị mà có nguồn gốc từ DependencyObject, nó cố gắng freeze đối tượng đầu tiên. Nếu đối tượng không thể bị đóng băng, nó sẽ ném một ngoại lệ và hoạt ảnh không chạy.

Nếu bạn đang tạo hoạt ảnh cho giá trị của loại tùy chỉnh mà bạn đã viết, có vẻ như bạn cần phải lấy được từ số Freezable hoặc NOT xuất phát từ DependencyObject.

Đối với tài sản đã tồn tại mà xuất phát từ DependencyObject và không Freezable, bạn không thể làm động chúng (StyleProperty hoặc TemplateProperty những trường hợp tại điểm). Thử sử dụng công cụ đặt thuộc tính bên trong một kiểu:

<Style.Triggers> 
    <Trigger Property="IsEnabled" Value="True"> 
    <Setter Property="Template" Value="{StaticResource TestTemplate}"/> 
    </Trigger> 
</Style.Triggers> 

Tạo tất cả logic chuyển đổi thành kiểu thay vì chuyển đổi giữa các kiểu khác nhau. Một thách thức mà bạn có thể có với điều này là thuộc tính đích phải là thuộc tính phụ thuộc, do đó bạn không thể sử dụng IsLoaded.

Tôi hy vọng bạn thấy điều này hữu ích.

Một ý nghĩ cuối cùng: Có thể xác định custom animations, mặc dù tôi chưa tự mình thực hiện việc này. Có một cơ hội bên ngoài mà bạn có thể viết "ObjectAnimation" tùy chỉnh của riêng bạn mà không bị giới hạn ở các lớp Freezable hoặc không phải DependencyObject.

+0

Nếu bạn cung cấp thêm thông tin về lý do bạn muốn tạo hiệu ứng cho một phong cách, tôi có thể đề xuất các lựa chọn thay thế khác. Mặc dù nó có vẻ tốt đẹp để animate đến một phong cách khác nhau, tôi chắc chắn có những cách khác để đạt được hiệu quả mong muốn. –

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