2012-06-17 14 views
5

Tôi có một số câu hỏi mở liên quan đến cùng một loại điều,Làm cách nào để tạo hoạt ảnh xoay trên đối tượng hình ảnh bằng cách sử dụng mã C# (trong cửa sổ WPF)

Tôi khá mới với WPF có kinh nghiệm với C# và Winforms.

Tôi đã xem xét trên mạng nội bộ để biết ví dụ hoạt động nhưng chưa tìm được ví dụ hoạt động.

Những gì tôi muốn đạt được là trong một hàm C# tạo sau

  • tạo ra một hình ảnh (hình ảnh 1)
  • tạo ra một hình ảnh (hình ảnh 2)
  • đưa những hình ảnh ở phía bên cửa sổ bên cạnh
  • tạo ra một kịch bản
  • animate thuộc tính xoay của image1 0-360 (animation1)
  • animate tài sản opacity hình ảnh 2 từ đầy đủ để vô hình (animation2)
  • các kịch bản nên chạy trong vòng mười giây với hình ảnh động 1 bắt đầu 0 giây và hình ảnh động 2 bắt đầu từ 5 giây

lời xin lỗi cho những yêu cầu rõ ràng cho mã, nhưng , tôi đã xem xét, và cố gắng, câu hỏi trước đây của tôi đã có mã đầy đủ mà thực hiện nhưng không có hình ảnh động cho thấy (link bên dưới)

how to create a storyboard and rotating an image in wpf using c# code

cảm ơn trước

Dan.

+0

Bạn có thực sự cần nó tất cả trong mã C#?một phần của điều này (đặc biệt là tạo ra hình ảnh và đặt chúng trên cửa sổ) chỉ đơn giản hơn rất nhiều trong XAML. – Tim

+0

true, hình ảnh và vị trí có thể nằm trong XAML nhưng bảng phân cảnh và hoạt ảnh phải ở trong C# –

+1

OK, tôi đã tiếp tục và đã thực hiện tất cả XAML và sau đó là tất cả C#. Bạn có thể trộn và kết hợp nếu cần :) – Tim

Trả lời

28

Đây là phiên bản XAML đang hoạt động của câu hỏi của bạn, tiếp theo là điều giống hệt trong C#. Có thể không chính xác những gì bạn đã làm sau, nhưng nó sẽ minh họa nó.

XAML phiên bản:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <Storyboard x:Key="Storyboard" BeginTime="00:00:00.000" Duration="00:00:10.000"> 
      <DoubleAnimation Storyboard.TargetName="RotateImage" 
          Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" 
          From="0" To="360" BeginTime="00:00:05.000" Duration="00:00:05.000" /> 
      <DoubleAnimation Storyboard.TargetName="OpacityImage" 
          Storyboard.TargetProperty="Opacity" 
          From="1" To="0" Duration="00:00:10.000" /> 
     </Storyboard> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <Image x:Name="RotateImage" Stretch="Uniform" Source="Chrysanthemum.jpg"> 
      <Image.RenderTransform> 
       <RotateTransform Angle="0" /> 
      </Image.RenderTransform> 
     </Image> 
     <Image x:Name="OpacityImage" Grid.Column="1" Stretch="Uniform" Source="Desert.jpg" /> 
     <Button Grid.Row="1" Grid.ColumnSpan="2" Content="Start"> 
      <Button.Triggers> 
       <EventTrigger RoutedEvent="Button.Click"> 
        <BeginStoryboard Storyboard="{StaticResource Storyboard}" /> 
       </EventTrigger> 
      </Button.Triggers> 
     </Button> 
    </Grid> 
</Window> 

Và C# phiên bản:

public MainWindow() 
    { 
     InitializeComponent(); 

     Image rotateImage = new Image() 
     { 
      Stretch = Stretch.Uniform, 
      Source = new BitmapImage(new Uri("pack://application:,,,/Chrysanthemum.jpg")), 
      RenderTransform = new RotateTransform() 
     }; 
     Image opacityImage = new Image() 
     { 
      Stretch = Stretch.Uniform, 
      Source = new BitmapImage(new Uri("pack://application:,,,/Desert.jpg")) 
     }; 

     LayoutRoot.Children.Add(rotateImage); 
     LayoutRoot.Children.Add(opacityImage); 

     Grid.SetColumn(opacityImage, 1); 

     Storyboard storyboard = new Storyboard(); 
     storyboard.Duration = new Duration(TimeSpan.FromSeconds(10.0)); 
     DoubleAnimation rotateAnimation = new DoubleAnimation() 
     { 
      From = 0, 
      To = 360, 
      Duration = storyboard.Duration 
     }; 
     DoubleAnimation opacityAnimation = new DoubleAnimation() 
     { 
      From = 1.0, 
      To = 0.0, 
      BeginTime = TimeSpan.FromSeconds(5.0), 
      Duration = new Duration(TimeSpan.FromSeconds(5.0)) 
     }; 

     Storyboard.SetTarget(rotateAnimation, rotateImage); 
     Storyboard.SetTargetProperty(rotateAnimation, new PropertyPath("(UIElement.RenderTransform).(RotateTransform.Angle)")); 
     Storyboard.SetTarget(opacityAnimation, opacityImage); 
     Storyboard.SetTargetProperty(opacityAnimation, new PropertyPath("Opacity")); 

     storyboard.Children.Add(rotateAnimation); 
     storyboard.Children.Add(opacityAnimation); 

     Resources.Add("Storyboard", storyboard); 

     Button button = new Button() 
     { 
      Content = "Begin" 
     }; 
     button.Click += button_Click; 

     Grid.SetRow(button, 1); 
     Grid.SetColumnSpan(button, 2); 

     LayoutRoot.Children.Add(button); 
    } 

    void button_Click(object sender, RoutedEventArgs e) 
    { 
     ((Storyboard)Resources["Storyboard"]).Begin(); 
    } 
+0

bạn đá, là hoàn toàn hoàn hảo. cảm ơn ... –

+0

Điều này thật tuyệt - một câu hỏi, làm thế nào để đặt điểm trung tâm của vòng xoay vào giữa hình ảnh (Tôi đang sử dụng Đường dẫn không phải là hình ảnh). –

+1

@Duncan, thử đặt RenderTransformOrigin thành (0,5,0.5). – mickeymicks

1

Animation là công việc như sau.

1-Chương trình tạo bộ hẹn giờ.

2-Chương trình kiểm tra bộ hẹn giờ trong khoảng thời gian đã đặt để xem lượng thời gian đã trôi qua.

3-Mỗi khi chương trình kiểm tra bộ hẹn giờ, nó tính toán giá trị độ mờ hiện tại cho hình chữ nhật dựa trên thời gian đã trôi qua.

4-Chương trình sau đó cập nhật hình chữ nhật với giá trị mới và vẽ lại nó.

Sau đây là Mã tạo hình chữ nhật và tạo ảnh động.

<Window x:Class="Animation.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Animated Rectangle" Height="350" Width="525"> 
<Grid> 
    <StackPanel Margin="10"> 
     <Image Name="MyImage" Source="e:\a.jpg" Width="100" Margin="50" ></Image> 
     <Rectangle 
      Name="MyRectangle" 
      Width="100" 
      Height="100" 
      Fill="Blue"> 

      <Rectangle.Triggers> 
       <!-- Animates the rectangle's opacity. --> 
       <EventTrigger RoutedEvent="Rectangle.Loaded"> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation 
           Storyboard.TargetName="MyImage" 
           Storyboard.TargetProperty="Opacity" 
           From="1.0" To="0.0" Duration="0:0:3" 
           AutoReverse="True" RepeatBehavior="Forever" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
      </Rectangle.Triggers> 
     </Rectangle> 
    </StackPanel> 
</Grid>