为什么这个silverlight动画会让整个布局消失?

时间:2009-03-06 16:05:27

标签: silverlight animation

我开始看看Silverlight,我想从小开始。我看过的所有例子都使用了关键帧动画,所以我想尝试不同类型的动画。我对从代码执行动画有些不熟悉,所以我决定尝试这个。我的最终目标是制作某种动画面板,但是现在我只用一个按钮就可以开始了:

<UserControl x:Class="TestSilverlight.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300" Background="Azure">
    <Grid x:Name="LayoutRoot" Background="Azure">
        <Button x:Name="btnClick" Content="Animate me!" Height="48" Width="96" Click="btn_Click">
        </Button>
    </Grid>
</UserControl>

我写了这个事件处理程序,我的thoguth很简单:

private void btn_Click(object sender, EventArgs e)
{
    Storyboard story = new Storyboard();
    story.RepeatBehavior = new RepeatBehavior(3.0);
    story.Duration = new Duration(TimeSpan.FromSeconds(1.0));

    if (btnClick.RenderTransform == null)
        btnClick.RenderTransform = new TranslateTransform();

    DoubleAnimation xAnim = new DoubleAnimation();
    xAnim.To = 50;
    Storyboard.SetTargetProperty(xAnim, new PropertyPath(TranslateTransform.XProperty));
    Storyboard.SetTarget(xAnim, btnClick.RenderTransform);

    story.Children.Add(xAnim);

    story.Begin();
}

单击按钮时我的期望是看到它滑动到右侧50个单位3次。实际发生的是整个布局消失,因为背景颜色和按钮一起消失。

如果我重写按钮的代码以RenderTransform开头,一切正常!

<Button x:Name="btnClick" Content="Animate me!" Height="48" Width="96" Click="btn_Click">
    <Button.RenderTransform>
        <TranslateTransform />
    </Button.RenderTransform>
</Button>

导致失败的第一种情况发生了什么?我做了一些根本错误的事情吗?

3 个答案:

答案 0 :(得分:1)

您可以通过删除对“btnClick.RenderTransform == null”的检查来解决问题,而是始终创建新的TranslateTransform,或检查“btnClick.RenderTransform是TranslateTransform”而不是null。

您看到此错误的原因是默认情况下Button对其RenderTransform具有标识转换,该转换恰好是MatrixTransform。因此,您尝试为MatrixTransform设置动画,就像它是TranslateTransform一样。

答案 1 :(得分:0)

上次我使用Silverlight时是在2008年早些时候。在Silverlight的Beta版本中,当发生任何错误而不是错误消息时,整个布局有时会消失(保持白色和空白)。 / p>

不确定当前版本是否仍然如此。您(或者您已经)是否可以逐步执行代码以检查是否抛出异常...或以编程方式捕获它并呈现某种错误消息?

希望我能帮到你一点点。

的Matthias

答案 2 :(得分:0)

我一直在研究几乎相同的事情,我读过的各种资料表明你不能以编程方式添加故事板。尝试在XAML中添加它,然后你可以在代码中修改它 - 只需确保命名它以便你可以访问它。您可能还必须在xaml中添加转换。需要记住的是,silverlight不是wpf,它很接近,但很多东西都不同 - 只是足以成为一种痛苦。

<UserControl x:Class="TestSilverlight.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300" Background="Azure">
    <UserControl.Resources>
        <StoryBoard Name="story" />
    </UserControl.Resources>

<Grid x:Name="LayoutRoot" Background="Azure">
    <Button x:Name="btnClick" Content="Animate me!" Height="48" Width="96" Click="btn_Click">
    </Button>
</Grid>