Pergunta

Estou começando a ter um olhar para o Silverlight, e eu queria começar pequeno. Todos os exemplos que eu olhei para animações de quadro-chave usados, então eu queria experimentar um tipo diferente de animação. I também foi um pouco familiarizado com a realização de animações a partir do código, então eu decidi tentar fazer isso também. Meu objetivo final é fazer algum tipo de painel animado, mas por agora eu estou começando em pequena escala com apenas um botão:

<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>

Eu escrevi este manipulador de eventos, que eu thoguth era bastante simples:

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();
}

O que esperar quando eu clico no botão é vê-lo deslizar para a direita 50 unidades 3 vezes. O que realmente acontece é todo o desaparece de layout, como na cor de fundo juntamente com o botão desaparece.

Se eu reescrever o código para o botão para iniciar com um RenderTransform, tudo funciona!

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

O que está acontecendo no primeiro caso, que causa a falha? Estou fazendo algo fundamentalmente errado?

Foi útil?

Solução

Você pode corrigir o problema removendo a verificação de "btnClick.RenderTransform == null", e em vez disso sempre criar uma nova TranslateTransform, ou verificar se há "btnClick.RenderTransform é TranslateTransform" em vez de nulo.

A razão que você está vendo este erro é que por padrão, o Button tem transformar uma identidade para a sua RenderTransform, que passa a ser um MatrixTransform. Então você está tentando animar uma MatrixTransform como se fosse um TranslateTransform.

Outras dicas

A última vez que trabalhou com Silverlight estava em anteriores versões 2008. Em beta do Silverlight, por vezes, todo o layout simplesmente desapareceu (ficou branco e esvaziar) quando qualquer erro ocorreu, em vez de uma mensagem de erro.

Não sei se isso ainda é o caso nas versões atuais. Pode você (ou você já) passo através do código para verificar se uma exceção é lançada ... ou pegá-lo por meio de programação e tornar algum tipo de mensagem de erro?

A esperança que eu poderia ajudá-lo um pouco.

Matthias

Eu tenho procurado em praticamente a mesma coisa, e várias fontes que eu li sugerem que você não pode adicionar storyboards programaticamente. Tente adicioná-lo no XAML, então você poderia mod-lo no código --- apenas certifique-se de nomeá-lo para que você possa acessá-lo. Você pode ter que adicionar o transformar no XAML também. A coisa a lembrar que o Silverlight não é WPF, é perto, mas muitas coisas são diferentes -. Apenas o suficiente para ser uma dor

<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>

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top