2 rocmemory rocmemory 于 2016.04.15 17:56 提问

执行动画后再设置Canvas.Left值不起作用

一个很奇怪的问题,不知道大家遇到过没有:
1、在Canvas中直接设置元素位置,是有效果的,比如 Canvas.SetLeft(box, 50);
2、使用一个StoryBoard或直接BeginAnimation动画改变位置,也是有效果的 (见test1_Click)
3、在使用动画改变元素位置后,再使用Canvas.SetLeft,纹丝不动!!?

XAML代码:

 <Canvas>
    <Border x:Name="box" Width="100" Height="100" Background="Blue" Canvas.Left="150" Canvas.Top="90"/>
    <Button x:Name="test1" Content="test1" Height="27" Canvas.Left="441" Canvas.Top="17" Width="57" Click="test1_Click"/>
    <Button x:Name="test2" Content="test2" Height="27" Canvas.Left="441" Canvas.Top="57" Width="57" Click="test2_Click"/>
</Canvas>

后台代码:

 private void test1_Click(object sender, RoutedEventArgs e)
{

    //((Storyboard)this.Resources["move"]).Begin();

    KeyTime time_layout = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(200));

    Storyboard sb = new Storyboard();

    DoubleAnimationUsingKeyFrames da = new DoubleAnimationUsingKeyFrames();
    sb.Children.Add(da);
    Storyboard.SetTarget(da, box);
    Storyboard.SetTargetProperty(da, new PropertyPath("(Canvas.Left)"));

    EasingDoubleKeyFrame kf_left = new EasingDoubleKeyFrame { KeyTime = time_layout, Value = 200 };
    da.KeyFrames.Add(kf_left);

    sb.Begin();

}

private void test2_Click(object sender, RoutedEventArgs e)
{
    Canvas.SetLeft(box, 50);
}

2个回答

rocmemory
rocmemory   2016.04.16 08:30
已采纳

已在c#技术区得到解决

devmiao
devmiao   Ds   Rxr 2016.04.15 23:44
rocmemory
rocmemory 那个帖子也是我发的,回帖的那个人完全不懂WPF
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Canvas.Top和Canvas.Left属性
Canvas控件提供一个画面用于在画布的特定坐标处显示子元素,属于绝对定位,相当于html中的div,Canvas.Top和Canvas.Left属性只有Canvas控件的子元素(并且是这个子元素紧挨着Canvas)用时才有效果,如下代码
Android的setVisibility(View.GONE)不起作用在使用Animation之后.
出现这种情况很可能是因为设置了animation,并且调用了setFillAfter(true),这就会导致setVisibility无效,只需要调用一下clearAnimation()方法或者去掉setFillAfter(true)语句即可。实验证明只要在setVisibility之前设置View的mCurrentAnimation为null就可以,因此调用setAnimation(null)也是
WPF动画之后属性值无法改变
前一段时间使用WPF写2048游戏的时候,遇到下面的情形:使用按键对色块进行移动时,触发位置左边X和Y属性的DoubleAnimation动画,但是如果此时改变窗口的大小,并触发Canvas.SetLeft重新设置色块的位置时,发现色块没有更新到正确的位置上。        通过调试发现,Canvas.SetLeft调用前后X和Y的数值并没有发生变化。        最终在微软官网找到原因   
在未设置animation时setVisibility()也不起作用的原因
有时候会发生setVisibility()不起作用的情况,网上搜索到的都是需要clearAnimation(),但是在试过之后发现并没有起作用。其实是我们忽视了一个问题,改变组件是需要在UI线程中进行的,所有我们需要启用UI线程去更新: MainActivity.this.runOnUiThread(new Runnable() { @Override
View setAnimation之后再setVisibility不起作用
前提是你的Animation设置了这样一个属性:  final Animation animation;animation.setFillAfter(true); 原因:       All the animations (before android 3.0) are actually applied to a bitmap which is a snapshot of your vi
当一个动画结束之后继续执行下一个动画
-
jquery结束动画执行其他动作
jquery结束动画执行其他动作
WPF 做的动画
WPF动画
iOS 关于CABasicAnimation动画完成后执行哪个动画的问题
当大家使用CABasicAnimation时,有时候会使用多个的CABasicAnimation。如何区分那个动画完成的呢。(CAKeyframeAnimation也是一样)代码如下:创建一个动画// 初始化动画类 CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform.scal
Android Animation动画 控制动画的执行效果,速度等
Android开发中必定会涉及到动画方面的效果,那么就会遇到一个问题,如果控制动画开始速度,与结束速度。 我们就可以在动画xml里面设置 android:interpolator="@android:anim/accelerate_interpolator" 设置动画为加速动画(动画播放中越来越快) android:interpolator="@android:anim/decelera