2014-09-19 65 views
0

我想要一个控件根据另一个属性更改其位置,但生成该新位置。但是,每当我开始新动画时,故事板都会将控件的位置重置为XAML中设置的属性。WP8.1:从当前位置开始动画

下面是我在做什么:

var animation = new DoubleAnimation(); 
animation.Duration = TimeSpan.FromSeconds(0.1); 

// This gets the value that was set in the XAML, not the current value   
// animation.From = Canvas.GetLeft(BackgroundImage); 
animation.To = newLocation; 

Storyboard.SetTarget(animation, BackgroundImage); 
Storyboard.SetTargetProperty(animation, "(Canvas.Left)"); 

Storyboard story = new Storyboard(); 
story.Children.Add(animation); 
story.Begin(); 

有什么办法要么得到控制当前动画值设置为animation.From,或者是有没有办法告诉故事板从当前属性的位置开始?

回答

1

说,如果你想动画Canvas.Left属性,则From值确实

Canvas.GetLeft(BackgroundImage) 

然而,离开From财产指定(怎么样,你的评论吧),该Storyboard应该从当前开始位置。所以你不需要上面的代码。

你的动画对我来说看起来很好。这可能是导致问题的其他原因。


更新

这里的工作示例,其中控制被动画到只要属性更改对应的位置。

在我的XAML中,我创建了一个Slider控制和每次SliderValue改变时,我想我的BackgroundImage控制Canvas.Left动画这个Value。这有点像你的问题中提到的另一个属性

XAML中

<Slider x:Name="MySlider" Margin="12,0" VerticalAlignment="Bottom" Minimum="20" Maximum="220" SmallChange="10" Value="20" /> 

守则

private Storyboard _storyboard = new Storyboard(); 
private DoubleAnimation _animation = new DoubleAnimation { Duration = TimeSpan.FromSeconds(0.1) }; 

public MainPage() 
{ 
    this.InitializeComponent(); 

    Storyboard.SetTarget(_animation, this.BackgroundImage); 
    Storyboard.SetTargetProperty(_animation, "(Canvas.Left)"); 
    _storyboard.Children.Add(_animation); 

    this.MySlider.ValueChanged += (s, e) => 
    { 
     _animation.To = this.MySlider.Value; 
     _storyboard.Begin(); 
    }; 
} 

正如你所看到的,我已经养了两个局部变量的StoryboardDoubleAnimation实例两者。然后当调用ValueChanged时,只需设置To并启动动画即可。

+0

当我一直在测试,Canvas.GetLeft总是返回在XAML中设置的值,而不是从故事板中设置的当前值。如果我开始一个新的故事板,它总是将Left值重置为XAML中设置的值。 – Jeff 2014-09-19 15:41:52

相关问题