代码之家  ›  专栏  ›  技术社区  ›  Eric Smith

在以编程方式添加的控件上使用情节提要动画

  •  36
  • Eric Smith  · 技术社区  · 15 年前

    我正在尝试将一个新控件淡入应用程序的“应用程序”区域,该区域是在删除现有控件后以编程方式添加的。我的代码如下所示:

            void settingsButton_Clicked(object sender, EventArgs e)
        {
            ContentCanvas.Children.Clear();
    
            // Fade in settings panel
            NameScope.SetNameScope(this, new NameScope());
    
            SettingsPane s = new SettingsPane();
            s.Name = "settingsPane";
    
            this.RegisterName(s.Name, s);
            this.Resources.Add(s.Name, s);
    
            Storyboard sb = new Storyboard();
    
            DoubleAnimation settingsFade = new DoubleAnimation();
            settingsFade.From = 0;
            settingsFade.To = 1;
            settingsFade.Duration = new Duration(TimeSpan.FromSeconds(0.33));
            settingsFade.RepeatBehavior = new RepeatBehavior(1);
            Storyboard.SetTargetName(settingsFade, s.Name);
            Storyboard.SetTargetProperty(settingsFade, new PropertyPath(UserControl.OpacityProperty));
    
            ContentCanvas.Children.Add(s);
    
            sb.Children.Add(settingsFade);
            sb.Begin();
        }
    

    我可能做错了什么?我很确定我已正确注册了所有内容:(

    4 回复  |  直到 7 年前
        1
  •  66
  •   user83286 user83286    15 年前

    我不想麻烦使用名称镜等,而是宁愿使用Storyboard.SetTarget。

    var b = new Button() { Content = "abcd" };
    stack.Children.Add(b);
    
    var fade = new DoubleAnimation()
    {
        From = 0,
        To = 1,
        Duration = TimeSpan.FromSeconds(5),
    };
    
    Storyboard.SetTarget(fade, b);
    Storyboard.SetTargetProperty(fade, new PropertyPath(Button.OpacityProperty));
    
    var sb = new Storyboard();
    sb.Children.Add(fade);
    
    sb.Begin();
    
        2
  •  12
  •   Marco A.    7 年前

    我在begin方法中使用此参数解决了问题,请尝试:

    sb.Begin(this);
    

        3
  •  5
  •   Cheeso    15 年前

    我同意,在这种情况下使用名称范围可能是错误的。使用SetTarget比使用SetTargetName更简单、更容易。

    如果它对其他人有帮助的话,下面是我用来高亮显示表格中某个特定单元格的内容,高亮显示会衰减为零。这有点像添加新答案时的StackOverflow突出显示。

        TableCell cell = table.RowGroups[0].Rows[row].Cells[col];
    
        // The cell contains just one paragraph; it is the first block
        Paragraph p = (Paragraph)cell.Blocks.FirstBlock;
    
        // Animate the paragraph: fade the background from Yellow to White,
        // once, through a span of 6 seconds.
    
        SolidColorBrush brush = new SolidColorBrush(Colors.Yellow);
        p.Background = brush;
        ColorAnimation ca1 = new ColorAnimation()
        {
                From = Colors.Yellow,
                To = Colors.White,
                Duration = new Duration(TimeSpan.FromSeconds(6.0)),
                RepeatBehavior = new RepeatBehavior(1),
                AutoReverse = false,
        };
    
        brush.BeginAnimation(SolidColorBrush.ColorProperty, ca1);
    
        4
  •  0
  •   NoWar    12 年前

    这可能很奇怪,但我的解决方案是使用两种方法:

    Storyboard.SetTargetName(DA, myObjectName);
    
    Storyboard.SetTarget(DA, myRect);
    
    sb.Begin(this);
    

    在这种情况下,没有错误。

     int n = 0;
            bool isWorking;
            Storyboard sb;
            string myObjectName;
             UIElement myElement;
    
            int idx = 0;
    
            void timer_Tick(object sender, EventArgs e)
            {
                if (isWorking == false)
                {
                    isWorking = true;
                    try
                    {
                          myElement = stackObj.Children[idx];
    
                        var possibleIDX = idx + 1;
                        if (possibleIDX == stackObj.Children.Count)
                            idx = 0;
                        else
                            idx++;
    
                        var myRect = (Rectangle)myElement;
    
                       // Debug.WriteLine("TICK: " + myRect.Name);
    
                        var dur = TimeSpan.FromMilliseconds(2000);
    
                        var f = CreateVisibility(dur, myElement, false);
    
                        sb.Children.Add(f);
    
                        Duration d = TimeSpan.FromSeconds(2);
                        DoubleAnimation DA = new DoubleAnimation() { From = 1, To = 0, Duration = d };
    
                        sb.Children.Add(DA);
                        myObjectName = myRect.Name;  
                       Storyboard.SetTargetName(DA, myObjectName);
                       Storyboard.SetTarget(DA, myRect);
    
                        Storyboard.SetTargetProperty(DA, new PropertyPath("Opacity"));
    
                        sb.Begin(this);
    
                        n++;
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine(ex.Message + "   " + DateTime.Now.TimeOfDay);
                    }
    
                    isWorking = false;
                }
            }