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


        这几天一直在对原来的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之前保存位置,呵呵

    就这样,问题解决!

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

  • 相关阅读:
    SpringBoot详细研究-01基础
    JDK1.8快速入门
    海外酒店业务学习
    NOSQL快速入门
    移动前端技术快速入门
    Spring快速入门
    Java基础组件快速入门
    JavaWeb快速入门
    TLS 与 python thread local
    python 类修饰器
  • 原文地址:https://www.cnblogs.com/chenlhuaf/p/1133031.html
Copyright © 2020-2023  润新知