初学者问题:没有动静? XAML - 使用WPF

时间:2011-12-17 08:41:12

标签: c# .net wpf xaml

为什么它不应该按照应有的方式工作?没有运动....下面是代码:

namespace MovingBox
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Storyboard myStoryboard = new Storyboard();

        public MainWindow()
        {
            InitializeComponent();

        }

        private void Start_Animation(object sender, EventArgs e)
        {
            myStoryboard.Begin();
        }

        private void MyAnimatedRectangle_MouseDown(object sender, MouseButtonEventArgs e)
        {
            Start_Animation(sender, e); 
        }
    }
}

XAML:

<Window x:Class="MovingBox.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">



<Grid>
    <StackPanel>
        <StackPanel.Resources>
            <Storyboard x:Name="myStoryboard" x:Key="myStoryboardKey">
                <DoubleAnimation
      Storyboard.TargetName="MyAnimatedRectangle"
      Storyboard.TargetProperty="Opacity"
      From="1.0" To="0.0" Duration="0:0:5" 
      AutoReverse="True" RepeatBehavior="Forever" />
            </Storyboard>
        </StackPanel.Resources>

        <Rectangle Loaded="Start_Animation" x:Name="MyAnimatedRectangle"
 Width="100" Height="100" Fill="Blue" MouseDown="MyAnimatedRectangle_MouseDown" />

    </StackPanel>
</Grid>

3 个答案:

答案 0 :(得分:2)

我总是尽量避免使用code-behind(使用C#代替XAML),而我宁愿这样做。我不确定它是否具有您想要的确切行为,但如果您有任何问题,请随时发表评论。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
                <Rectangle x:Name="MyAnimatedRectangle"
                           Width="100" Height="100" Fill="Blue">
                    <Rectangle.Triggers>
                        <EventTrigger RoutedEvent="Rectangle.MouseEnter">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation 
                Storyboard.TargetName="MyAnimatedRectangle"
                Storyboard.TargetProperty="Opacity"
                From="1" To="0" Duration="0:0:1"  AutoReverse="True" RepeatBehavior="Forever"  />

                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Rectangle.Triggers>
                </Rectangle>
        </StackPanel>
    </Grid>
</Window>

这也可能有用: http://msdn.microsoft.com/en-us/library/ms742868.aspx

答案 1 :(得分:2)

问题是您只能通过分配x:Name来访问代码中的资源。在您所做的事情背后的代码中,您创建了一个新的Storyboard。您尚未在StackPanel的资源内分配任何现有的故事板。

要运行此命令,只需在代码中命名stackpanel,然后将资源分配给storybard并使用它

  <StackPanel x:Name="test">
        <StackPanel.Resources>
            <Storyboard x:Name="myStoryboard" x:Key="myStoryboardKey">
                <DoubleAnimation Storyboard.TargetName="MyAnimatedRectangle"
                                 Storyboard.TargetProperty="Opacity"
                                 From="1.0" To="0.0" Duration="0:0:5" 
                                 AutoReverse="True" RepeatBehavior="Forever" />
            </Storyboard>
        </StackPanel.Resources>

        <Rectangle Loaded="Start_Animation" 
                   x:Name="MyAnimatedRectangle" 
                   Width="100" Height="100" 
                   Fill="Blue" Opacity="1" 
                   MouseDown="MyAnimatedRectangle_MouseDown" />

    </StackPanel>

代码:

 myStoryboard = test.Resources["myStoryboardKey"] as Storyboard;
        myStoryboard.Begin();

答案 2 :(得分:1)

您在Start_Animation方法中引用的myStoryBoard与XAML中的不同。

这是一个搜索故事板资源的工作版本: 请注意,我删除了Storyboard myStoryboard = new Storyboard();

private void MyAnimatedRectangle_MouseDown(object sender, MouseButtonEventArgs e)
{
    PlayMyStoryboard(sender as FrameworkElement);
}

private void PlayMyStoryboard(FrameworkElement sender)
{
    var sb = sender.FindResource("myStoryboardKey") as Storyboard;
    if (sb != null)
    {
        sb.Begin();
    }
}

private void Start_Animation(object sender, RoutedEventArgs e)
{
    PlayMyStoryboard(sender as FrameworkElement);
}