WPF学习心得(1):WPF进行动画后不能改变相对应的属性问题的解决

本文介绍了解决WPF应用程序中动画结束后元素无法手动调整的问题。通过Storyboard的特定使用方式及动画完成后的处理,使得UI元素在动画结束后仍可被正常操控。

    这几天一直在对原来的WPF应用程序进行改进和重构,准备为应用程序加入一些动画操作,但问题来了!
    经由动画改变的属性不能变化了,只能再次通过动画更改。
    
这也太不爽了吧。搞一两个小时,终于找到了解决的办法。
    下面给出主要代码:
   

foreach (UIElement control in canvas.Children)
            
{
                
//UserControl
                RealTimeChartFlexible chartFlexible = (RealTimeChartFlexible)control;
                
//开始动画

                
//注册名字(对于UserControl来说很关键的一步,本人试了很久)
                chartFlexible.RegisterName("chartFlexible", chartFlexible);

                
//left
                DoubleAnimation leftAni = new DoubleAnimation();
                leftAni.To 
= colNum * pWidth;
                leftAni.Duration 
= new Duration(new TimeSpan(001));
                Storyboard.SetTargetName(leftAni, 
"chartFlexible");
                Storyboard.SetTargetProperty(leftAni, 
new PropertyPath(Canvas.LeftProperty));
                
//top
                DoubleAnimation topAni = new DoubleAnimation();
                topAni.To 
= rowNum * pHeight;
                topAni.Duration 
= new Duration(new TimeSpan(001));
                Storyboard.SetTargetName(topAni, 
"chartFlexible");
                Storyboard.SetTargetProperty(topAni, 
new PropertyPath(Canvas.TopProperty));
                
//width
                DoubleAnimation WidthAni = new DoubleAnimation();
                WidthAni.To 
= pWidth;
                WidthAni.Duration 
= new Duration(new TimeSpan(001));
                Storyboard.SetTargetName(WidthAni, 
"chartFlexible");
                Storyboard.SetTargetProperty(WidthAni, 
new PropertyPath(RealTimeChartFlexible.WidthProperty));
                
//height
                DoubleAnimation HeightAni = new DoubleAnimation();
                HeightAni.To 
= pHeight;
                HeightAni.Duration 
= new Duration(new TimeSpan(001));
                Storyboard.SetTargetName(HeightAni, 
"chartFlexible");
                Storyboard.SetTargetProperty(HeightAni, 
new PropertyPath(RealTimeChartFlexible.HeightProperty));

                Storyboard sb 
= new Storyboard();
                sb.Children.Add(leftAni);
                sb.Children.Add(topAni);
                sb.Children.Add(HeightAni);
                sb.Children.Add(WidthAni);
                storys.Add(sb);
                sb.Completed 
+= new EventHandler(sb_Completed);
                sb.Begin(chartFlexible, 
true);

                
//chartFlexible.Width = pWidth;
                
//chartFlexible.Height = pHeight;

                chartFlexible.myOriginalWidth 
= pWidth;
                chartFlexible.myOriginalHeight 
= pHeight;

                chartFlexible.myTop 
= rowNum * pHeight;
                chartFlexible.myLeft 
= colNum * pWidth;

                
//Canvas.SetLeft(chartFlexible, chartFlexible.myLeft);
                
//Canvas.SetTop(chartFlexible, chartFlexible.myTop);


                rowNum
++;
                
if (rowNum == row)
                
{
                    colNum
++;
                    rowNum 
= 0;
                }

            }

 

 关键就在于Storybroad的Begin方法的第二个参数,可以使动画为可控制,以便动画完成后移除。

void sb_Completed(object sender, EventArgs e)
        
{
            
int index = 0;
            
foreach (object control in canvas.Children)
            
{
                RealTimeChartFlexible chartFlexible 
= (RealTimeChartFlexible)control;
                
double top = Canvas.GetTop(chartFlexible);
                
double left = Canvas.GetLeft(chartFlexible);
                
double height = chartFlexible.Height;
                
double width = chartFlexible.Width;
                storys[index].Remove(chartFlexible);
                chartFlexible.Height 
= height;
                chartFlexible.Width 
= width;
                Canvas.SetLeft(chartFlexible, left);
                Canvas.SetTop(chartFlexible, top);
                index
++;
            }

        }

storys是一个Storyboard的表,执行了Remove方法后UIElement的位置会回到做动画之前,要在执行Remove之前保存位置,呵呵

就这样,问题解决!

如果各位有更好的办法可以留言给我,谢谢!

 

转载于:https://www.cnblogs.com/chenlhuaf/archive/2008/04/01/1133031.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值