Carregando UserControl dinamicamente
Neste artigo será mostrado como carregar uma *.dll (usercontrol) dinamicamente em Silverlight.
O motivo que me inspirou a fazer este exemplo foi um amigo do MSN que pediu para ajudá-lo a carregar animações dinâmicas externas. Além disso, percebi outro fator; Às vezes podemos ter uma aplicação grande, e como sabemos ou devemos saber, o Silverlight cria um arquivo XAP, que nada mais é, que um Zip disfarçado. Desta forma, quando acessamos um site desenvolvido em Silverlight, nós fazemos o download deste arquivo XAP. Neste ponto, você pode imaginar que, se o arquivo Xap for muito grande, o usuário irá ficar extremamente aborrecido e irá 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.
Criando Class Library
Crie uma class Library, indo em VS: File -> New->Project. Em Recent Templates escolha Silverlight e Silverlight Class Library, conforme demonstrado na Figura 01. Forneça um nome , tal como, UCElipse e pressione “ok”.

Figura 01 - Criando uma Class Library
No solution Explorer, pressione o botão direito e adicione um novo item, selecione Silverlight User Control, forneça o nome de UCEclipse.xaml e pressione “ok”. Conforme mostrado na Figura 02.

Figura 02 - Adicionando Usercontrol
Para este userControl (UCEclipse.xaml), vamos criar uma animação com o nome de SbElipse, a qual irá fazer com que uma elipse translada e rotacione no seu ponto central. A Listagem 01 traz o código da animação.
|
<UserControl x:Class="UCElipse.UCEclipse"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<UserControl.Resources>
<Storyboard x:Name="SbElipse">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="ellipse1">
<EasingDoubleKeyFrame KeyTime="0:0:5" Value="242"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" Storyboard.TargetName="ellipse1">
<EasingDoubleKeyFrame KeyTime="0:0:5" Value="-180"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<Ellipse Height="71" HorizontalAlignment="Left" Margin="51,54,0,0" Name="ellipse1" Stroke="Black" StrokeThickness="1" VerticalAlignment="Top" Width="65" Fill="#FFB41212" RenderTransformOrigin="0.5,0.5" >
<Ellipse.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Ellipse.RenderTransform>
</Ellipse>
</Grid>
</UserControl>
|
Listagem 01 - Animação da classe UCEclipse
Continuando com a animação, para que a animação seja executada ao carregar a aplicação, basta utilizar o método Begin presente na Class Storyboard. Então no code-Behind do UCEclipse.xaml.cs adicione o código conforme Listagem 02.
|
namespace UCElipse
{
public partial class UCEclipse : UserControl{
public UCEclipse(){
InitializeComponent();
SbElipse.Begin();}
}
}
|
Listagem 02 - Executando animação com o método Begin
Compile a class Library para gerar a dll.
Criando o projeto Silverlight
Agora, o que precisamos fazer é criar um novo projeto Silverlight. Forneça o Nome para o projeto de App_CarregarDll, e dentro da Aplicação Asp.Net adicione a DLL , tal como “UCElipse.dll”. Veja a demonstração na Figura 03.
 Algumas explicações do código que será apresentado na Listagem 03.
• A namespace, using System.Reflection 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.
|
using System.Reflection;
namespace App_CarregarDll
{
public partial class MainPage : UserControl
{
private Assembly _assembly;
public MainPage()
{
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 = "UCElipse.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);
// UCElipse.UCEclipse, esta é minha classe
UserControl control = (UserControl)_assembly.CreateInstance("UCElipse.UCEclipse");
LayoutRoot.Children.Add(control);
}
}
}
|
Listagem 03 – Código para carregar DLL
Este é o final do tutorial, que mostrou como carregar dinamicamente uma dll. Espero que tenha gostado e seja feliz. Dúvidas, críticas e sugestões, é só postar. Pois só assim saberei como estou explicando.
Abraços e obrigada, Flávia Moreira
|