Por que esta animação Silverlight fazer todo o layout desaparecer?
-
03-07-2019 - |
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?
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>