【问题标题】:Trouble animating a button created at runtime无法为运行时创建的按钮设置动画
【发布时间】:2012-04-11 13:54:20
【问题描述】:

我有一个包含一堆按钮的 UniformGrid,当 UniformGrid 第一次显示它时,它会循环显示每个按钮的动画。这一切都很好,但是当用户按下某个按钮时,所有按钮都会从网格中删除,并且会在其中创建一些新按钮并再次进行动画处理。

这是我在代码中创建按钮的方式

    int ModelsAnimateIndex = 0;  // Index of button to animate

    private void GetModels()
    {
        DirectoryInfo di = new DirectoryInfo(Globals.ModelsPath);
        FileInfo[] fis = di.GetFiles();

        // ugModels is the UniformGrid

        switch (fis.Length)
        {
            case 1:
                ugModels.Rows = 1;
                ugModels.Columns = 1;
                break;
            case 2:
                ugModels.Rows = 1;
                ugModels.Columns = 2;
                break;
            case 3:
            case 4:
                ugModels.Rows = 2;
                ugModels.Columns = 2;
                break;
            case 5:
            case 6:
                ugModels.Rows = 2;
                ugModels.Columns = 3;
                break;
            case 7:
            case 8:
            case 9:
                ugModels.Rows = 3;
                ugModels.Columns = 3;
                break;
            default:
                break;
        }

        foreach (FileInfo s in fis)
        {
            ugModels.Children.Add(new Button()
            {
                Background = ThemeColour,                             // SolidBrush
                Foreground = new SolidColorBrush(Colors.White),
                Name = "btn" + s.Name.Split('.')[0].Replace(" ",""),
                Style = MainButtonStyle,                              // Button Style
                Content = s.Name.Split('.')[0]
            });
        }
    }

现在是按钮单击事件,它开始为新创建的按钮设置动画

private void btnModelSelect_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        // TODO: Add event handler implementation here.
        sbShowMenuButton.Completed += new EventHandler(sbShowModels_Completed);
        Storyboard.SetTargetName(sbShowMenuButton.Children[0], ((Button)ugModels.Children[ModelsAnimateIndex]).Name);
        Storyboard.SetTargetName(sbShowMenuButton.Children[1], ((Button)ugModels.Children[ModelsAnimateIndex]).Name);
        Storyboard.SetTargetName(sbShowMenuButton.Children[2], ((Button)ugModels.Children[ModelsAnimateIndex]).Name);
        sbShowMenuButton.Begin((Button)ugModels.Children[ModelsAnimateIndex]); // Error is here
    }

当第一个按钮尝试动画时,我收到以下错误

在“System.Windows.Controls.Button”的名称范围内找不到“btnTestModel”名称。

【问题讨论】:

  • 尝试使用 SetTarget 而不是 SetTargetName。反正你有一个对象的引用,那么为什么要让 WPF 去查找它呢?
  • 当更改为 SetTarget 时,我在开始时收到以下错误。 '[Unknown]' 属性未指向路径 '(0).(1)[0].(2)' 中的 DependencyObject。

标签: c# wpf


【解决方案1】:

我已经解决了我的问题。我需要在这样创建的按钮上创建 RenderTransform。

foreach (FileInfo s in fis)
        {
            ugModels.Children.Add(new Button()
            {
                Background = ThemeColour,
                //          This Fixed the problem           //
                RenderTransform = new TransformGroup()
                {
                    Children = new TransformCollection()
                    {
                        new ScaleTransform(),
                        new SkewTransform(),
                        new RotateTransform(),
                        new TranslateTransform()
                    }
                },                
                ////////////////////////////////////////////////
                BorderBrush = null,
                Foreground = new SolidColorBrush(Colors.White),
                Name = "btn" + s.Name.Split('.')[0].Replace(" ", ""),
                Margin = new Thickness(12, 12, 12, 12),
                FontSize = 48,
                Style = MainButtonStyle,
                Content = s.Name.Split('.')[0]
            });
        }    

感谢马特的建议,我也修改了故事板的设置

private void btnMenu_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        sbShowMenuButton.Completed += new EventHandler(sbShowModels_Completed);
        Storyboard.SetTarget(sbShowMenuButton, ((Button)ugModels.Children[ModelsAnimateIndex]));            
        sbShowMenuButton.Begin();
    } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    相关资源
    最近更新 更多