2011-12-17 17 views
0

爲什麼它沒有按照它應該的方式工作?沒有運動....下面是代碼:初學者的問題:沒有任何動靜? XAML - 使用WPF

namespace MovingBox 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     Storyboard myStoryboard = new Storyboard(); 

     public MainWindow() 
     { 
      InitializeComponent(); 

     } 

     private void Start_Animation(object sender, EventArgs e) 
     { 
      myStoryboard.Begin(); 
     } 

     private void MyAnimatedRectangle_MouseDown(object sender, MouseButtonEventArgs e) 
     { 
      Start_Animation(sender, e); 
     } 
    } 
} 

XAML:

<Window x:Class="MovingBox.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"> 



<Grid> 
    <StackPanel> 
     <StackPanel.Resources> 
      <Storyboard x:Name="myStoryboard" x:Key="myStoryboardKey"> 
       <DoubleAnimation 
     Storyboard.TargetName="MyAnimatedRectangle" 
     Storyboard.TargetProperty="Opacity" 
     From="1.0" To="0.0" Duration="0:0:5" 
     AutoReverse="True" RepeatBehavior="Forever" /> 
      </Storyboard> 
     </StackPanel.Resources> 

     <Rectangle Loaded="Start_Animation" x:Name="MyAnimatedRectangle" 
Width="100" Height="100" Fill="Blue" MouseDown="MyAnimatedRectangle_MouseDown" /> 

    </StackPanel> 
</Grid> 

回答

1

你是指在Start_Animation方法的myStoryBoard是從一個在XAML不同的一個。

這裏有一個工作版本,搜索故事板資源: 請注意,我刪除了Storyboard myStoryboard = new Storyboard();

private void MyAnimatedRectangle_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    PlayMyStoryboard(sender as FrameworkElement); 
} 

private void PlayMyStoryboard(FrameworkElement sender) 
{ 
    var sb = sender.FindResource("myStoryboardKey") as Storyboard; 
    if (sb != null) 
    { 
     sb.Begin(); 
    } 
} 

private void Start_Animation(object sender, RoutedEventArgs e) 
{ 
    PlayMyStoryboard(sender as FrameworkElement); 
} 
+0

謝謝!這太酷了.... :) – BigBug 2011-12-17 09:00:29

2

我總是儘量避免使用code-behind(使用C#代替XAML)時,我可以,我寧願做這樣的事情。我不確定它是否具有您想要的確切行爲,但如果您有任何問題,請隨時發表評論。

<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"> 
    <Grid> 
     <StackPanel> 
       <Rectangle x:Name="MyAnimatedRectangle" 
          Width="100" Height="100" Fill="Blue"> 
        <Rectangle.Triggers> 
         <EventTrigger RoutedEvent="Rectangle.MouseEnter"> 
          <BeginStoryboard> 
           <Storyboard> 
            <DoubleAnimation 
       Storyboard.TargetName="MyAnimatedRectangle" 
       Storyboard.TargetProperty="Opacity" 
       From="1" To="0" Duration="0:0:1" AutoReverse="True" RepeatBehavior="Forever" /> 

           </Storyboard> 
          </BeginStoryboard> 
         </EventTrigger> 
        </Rectangle.Triggers> 
       </Rectangle> 
     </StackPanel> 
    </Grid> 
</Window> 

這可能是有用的,以及: http://msdn.microsoft.com/en-us/library/ms742868.aspx

2

的問題是,你不能只是分配一個X訪問你的代碼中的資源:名稱。在你所做的背後的代碼中,你創建了一個新的Storyboard。您尚未在StackPanel的資源內分配任何現有故事板。

要運行這個剛命名的StackPanel在代碼中,只是將資源分配給storybard,並用它

<StackPanel x:Name="test"> 
     <StackPanel.Resources> 
      <Storyboard x:Name="myStoryboard" x:Key="myStoryboardKey"> 
       <DoubleAnimation Storyboard.TargetName="MyAnimatedRectangle" 
           Storyboard.TargetProperty="Opacity" 
           From="1.0" To="0.0" Duration="0:0:5" 
           AutoReverse="True" RepeatBehavior="Forever" /> 
      </Storyboard> 
     </StackPanel.Resources> 

     <Rectangle Loaded="Start_Animation" 
        x:Name="MyAnimatedRectangle" 
        Width="100" Height="100" 
        Fill="Blue" Opacity="1" 
        MouseDown="MyAnimatedRectangle_MouseDown" /> 

    </StackPanel> 

代碼:

myStoryboard = test.Resources["myStoryboardKey"] as Storyboard; 
     myStoryboard.Begin();