Carregando UserControl dinamicamente

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

 

 



blog comments powered by Disqus

NewsLetter

Por favor preencher os campos.
Quer receber artigos?


Receber em HTML?