Neste artigo será mostrado como carregar uma dll de usercontrol dinamicamente em Silverlight. Pois bem, o motivo que me inspirou a fazer este exemplo foi um amigo meu do MSN que insistiu para ajudá-lo a carregar animações dinâmicas vindo externamente. Além disso, percebi um big fator, às vezes podemos ter uma aplicação grande, e como sabemos, o Silverlight cria o arquivo XAP, que é um Zip disfarçado, e fazemos o download deste santo arquivo. Neste ponto, você pode imaginar que, se seu arquivo Xap for grande o usuário irá ficar extremamente zangado e desistir de ver sua aplicação, não é mesmo?. Então o que devemos fazer ?
Simplesmente devemos é quebrar nossa aplicação em partes, ou seja, criar class Library e usar algumas classes importantes para isso. Vamos ver então:
Passo 1.
Crie uma class Library, indo em VS: File -> New->Project. Em Project types escolha silverlight e em Templates Silverlight Class Library. Forneça um nome, tal como: Bola e pressione ok.
Na solution Explorer, botão direito e adicione um novo item, selecione Silverlight User Control, forneça o nome de Bola.Xaml e pressione Ok.
Para este demo eu criei uma animação, e chamei no meu construtor, como segue:
<UserControl x:Class=”Bola.Bola”
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
Width=”400″ Height=”300″>
<UserControl.Resources>
<Storyboard x:Name=”SbBola”>
<DoubleAnimationUsingKeyFrames BeginTime=”00:00:00“ Storyboard.TargetName=”ellipse” Storyboard.TargetProperty=”(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)”>
<SplineDoubleKeyFrame KeyTime=”00:00:01.2000000″ Value=”64″/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime=”00:00:00“ Storyboard.TargetName=”ellipse” Storyboard.TargetProperty=”(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)”>
<SplineDoubleKeyFrame KeyTime=”00:00:01.2000000″ Value=”160″/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</UserControl.Resources>
<Grid x:Name=”LayoutRoot” Background=”White”>
<Ellipse Height=”80″ HorizontalAlignment=”Left” Margin=”24,48,0,0″ VerticalAlignment=”Top” Width=”80″ Fill=”#FF9B2B2B” Stroke=”#FF000000″ RenderTransformOrigin=”0.5,0.5″ x:Name=”ellipse”>
<Ellipse.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Ellipse.RenderTransform>
</Ellipse>
</Grid>
</UserControl>
Na parte do CodeBehind :
namespace Bola
{
public partial class Bola : UserControl
{
public Bola()
{
InitializeComponent();
SbBola.Begin();
}
}
}
Bem até ai nada demais.
Agora compile para gerar a dll.
Passo 2
Agora, o que precisamos fazer é criar um projeto Silverlight e adicionar a dll, tal como “Bola.dll” dentro da Aplicação Asp.Net, conforme Figura 1. Eu forneci o nome para o meu projeto de LoadAnimation.
Passo 3
O código seguinte mostra como carregar e mostrar o controle silverlight, ou seja, a dll.
Algumas explicações do código:
- Adicione o seguinte namespace, using System.Reflection, que irá permitir pegar o Assembly do objeto.
- Usar WebClient para abrir uma leitura assíncrona da dll.
- Pegar o caminho absoluto da dll.
- Quando o download é terminado, o assembly é carregado e uma instancia do controle é criada.
- Finalmente, é adicionado dentro do Layoutroot.
[Code]
namespace LoadAnimation
{
public partial class Page : UserControl
{
//assembly para ler a dll
private Assembly _assembly;
public Page()
{
InitializeComponent();
Load();
}
private void Load()
{
//puxar o arquivo da Aplicacao Asp.Net, precisa ser assincrono
WebClient down = new WebClient();
down.OpenReadCompleted += new OpenReadCompletedEventHandler(download_OpenReadCompleted);
string classe = “Bola.dll”;
string absoluteUri = System.Windows.Application.Current.Host.Source.AbsoluteUri;
string caminho = absoluteUri.Substring(0, absoluteUri.IndexOf(“ClientBin”)) + classe;
//assincrono
down.OpenReadAsync(new Uri(caminho, UriKind.Absolute));
}
//Ao terminar de ler é carregada na aplicacao
void download_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
AssemblyPart assemblyPart = new AssemblyPart();
_assembly = assemblyPart.Load(e.Result);
//Bola.Bola, esta é minha classe
UserControl control = (UserControl)_assembly.CreateInstance(“Bola.Bola”);
LayoutRoot.Children.Add(control);
}
}
}
Muito obrigada,
Flávia Moreira
Oi Flávia,
Há alguns meses estou me dedicando com minha equipe a entender o mundo silverlight, e gostaria de parabenizá-la por seus artigos.
Hoje separei algumas de minhas anotações para lhe enviar, mas não achei um link em que eu pudesse fazê-lo, seria legal você colocar um link de contato, ou me enviar um email… claro isso se você tiver interesse…
Abraços,
Paulo Eduardo
Olá Paulo.
Obrigada primeiramente pelo comentário.
Bem, eu enviei um e-mail para você também com o meu e-mail, bem eu não coloquei um link no meu
. Mas enfim, no que eu poderia ajudar ?
blog, pois, eu sempre respondo as perguntas que as pessoas fazem para mim no
proprio blog e sempre, sempre retorno as mensagens por e-mail, mesmo às
vezes que eu não sei responder
abraços
Flávia Moreira