Este artigo foi traduzido por máquina.

.NET dinâmico

Criando mapas interativos do Bing com o Silverlight e o IronRuby

Ashish Ghoda

Um dos notáveis recursos do Silverlight é seu suporte a linguagens dinâmicas como IronRuby e IronPython. Esse recurso de integração permite o desenvolvimento de aplicações ricas para Internet (RIAs) usando a plataforma Silverlight — XAML para a camada de apresentação e as linguagens dinâmicas para o code-behind. Este artigo demonstra a capacidade de integração do Silverlight com linguagens dinâmicas e os controles Microsoft Bing Map. Eu irá iniciar com uma visão geral de alto nível das linguagens dinâmicas e, em seguida, mergulhar no suporte do Silverlight para esses idiomas. Irá concluir mostrando como construir um 3D animado localização local Silverlight aplicativo interativo usando o controle do Silverlight do Microsoft Bing mapa e IronRuby.

Noções básicas de linguagem dinâmico

Ambientes de REPL (Read Eval Print Loop) oferecem leve “ tocar durante o processo ” capacidade de programação para desenvolvedores por meio do uso do que é conhecido como linguagens de programação dinâmicas — idiomas dinamicamente digitados e compilados no tempo de execução. Você não precisa declarar variáveis de tipos de dados específico. Tudo o que é tratado pelo tempo de execução por meio do contexto de expressões.

As linguagens mais familiares, como translation from VPE for Csharp e Visual Basic são linguagens tipificadas estaticamente que são mais rígidas por natureza. Desenvolvimento e implantação usando as linguagens dinâmicas é mais simples em comparação com as linguagens estáticas, que requer compilação e a distribuição de saída. No entanto, você ainda precisa fazer a validação correta e testar a segurança de tipos ao usar dinamicamente digitado idiomas.

Com linguagens dinâmicas, você pode criar uma função e atribuí-la a uma variável ou passá-la como um parâmetro para outra função. Isso torna coisas como fechamentos e funções de passagem como parâmetros muito mais fácil. Em geral, duas características determinantes de fechamentos são a capacidade de atribuir um bloco de código (uma função) para uma variável e este bloco de capacidade do código de manter o acesso a variáveis que eram acessível onde ele foi criado.

O seguinte método ShortWords tradicional em translation from VPE for Csharp retorna um subconjunto de uma lista de palavras que correspondam aos critérios de um comprimento máximo de palavra de letras de 3 ou menos:

public static List<string> ShortWords(List<string> wordList) {
  List<string> shortWordList = new List<string>();
  int maximumWordLength = 3;
  foreach(string word in wordList) {
    if(word.Length <= maximumWordLength) {
      shortWordList.Add(word);
    }
  }
  return(shortWordList);
}

Com o LINQ, você pode alcançar funcionalidade semelhante de uma maneira muito mais eficiente, como você pode ver no trecho de código a seguir:

public static List<string> ShortWords(List<string> wordList) {
  var maximumWordLength = 3;
  return wordList.Where(w => w.Length <=      
     maximumWordLength).ToList<string>();
end

Implementando o mesmo método em uma linguagem dinâmica como IronRuby — uma implementação da linguagem de programação Ruby para o Microsoft .NET Framework — é semelhante para translation from VPE for Csharp usando abordagem do LINQ e é significativamente menor do que a abordagem tradicional:

def ShortWords(wordList)
  maximumWordLength = 3
  return wordList.select {|w| w.Length <= maximumWordLength}
end

Comparar apenas essas duas implementações do mesmo algoritmo revela muito sobre IronRuby (e as linguagens dinâmicas em geral). O código do IronRuby é conciso e ainda vê um dados digite a palavra-chave como string ou inteiro.

O aspecto mais interessante este bloco de código IronRuby é o fechamento, localizado entre as chaves. Aqui o fechamento, essencialmente, uma função, está sendo passado para o método select. O método select usa um fechamento para extrair um subconjunto de uma coleção. O código que forma o fechamento, na verdade, é executado dentro do método select (aqui, o fechamento extrai seqüências de caracteres a lista de palavras de coleção que atendem o critério), mas mantém o acesso às variáveis no seu escopo original (no caso, a variável maximumWordLength).

Fechamentos são muito mais poderosos que ilustra esse exemplo simples. Eles são semelhantes aos usando o LINQ ou passar um delegado para um método como EXISTS ou Find in translation from VPE for Csharp, com a vantagem adicional de reter o acesso ao seu escopo original. Você pode obter mais detalhes sobre feriados do livro, escrevi com Jeff Scanlon, “ Accelerated Silverlight 3 ” (Apress, julho de 2009).

Linguagens dinâmicas para o Silverlight

Atualmente, o Silverlight oferece suporte a linguagens dinâmicas IronRuby e IronPython via o mecanismo Microsoft DLR (Dynamic Language Runtime) — uma plataforma genérica e um modelo de hospedagem para linguagens dinâmicas ser executado sobre o Microsoft .NET Framework CLR Common Language Runtime ().

O DLR é um conjunto de bibliotecas do .NET Framework e serviços que dinamicamente detectar tipos em tempo de execução usando reflexão, para que os códigos escritos em linguagens dinâmicas possam ser executados na plataforma .NET.

Há cinco DLR assemblies de script que fornecem o ambiente de tempo de execução do script — ponte as linguagens dinâmicas com o Silverlight:

  • Microsoft.Scripting.dll
  • Microsoft.Scripting.Core.dll
  • Microsoft.Scripting.Silverlight.dll
  • Microsoft.Scripting.ExtensionAttribute.dll
  • Microsoft.Scripting.Debugging.dll

Microsoft.Scripting.Silverlight.dll contém classes que permitem desenvolvedores escrever aplicativos Silverlight usando linguagens dinâmicas. Uma das classes principais é DynamicApplication, que herda diretamente de System.Windows.Application. Esta classe representa o objeto de aplicativo dinâmico baseado no Silverlight, fornecendo acesso aos elementos visuais do código de linguagem dinâmica, bem como um ponto de entrada para aplicativos de linguagem dinâmica de host nos hosts do Silverlight. Ele provides propriedades adicionais que estendem as propriedades de host, recursos e RootVisual já fornecidas pela classe Application.

IronRuby (IronRuby.NET) é uma implementação de código-fonte aberto da linguagem de programação Ruby oferece integração entre Ruby e o .NET Framework.

A versão atual do IronRuby (1.0-rc1) oferece suporte ao .NET Framework 3.5 e a versão beta do .NET Framework 4. Observe que IronRuby 1.0-rc1 oferece arquivos .zip e .msi downloads. Dos aplicativos do Silverlight, é melhor usar a versão ZIP.

IronPython (IronPython.codeplex.com) é uma implementação de código-fonte aberto da Python programação linguagem que, como IronRuby, permite a integração da linguagem Python com o .NET Framework. No momento você pode baixar o IronPython 2.6 para o .NET Framework 3.5 e a versão beta do .NET Framework 4.

IronRuby e IronPython possuem dois assemblys que oferecem suporte a idioma específico, fornecendo recursos como analisar o idioma e se comunicar com o ambiente de host. Eles são IronPython.dll e IronPython.Modules.dll de IronPython e IronRuby.dll e IronRuby.Libraries.dll para IronRuby.

Observe que tanto IronRuby IronPython no desenvolvimento contínuo. Visite seus homepages para acessar as versões mais recentes e documentação. Você também pode obter o código de origem relacionados, juntamente com o código-fonte do DLR, visitando DLR.codeplex.com.

Instalando componentes de desenvolvimento

Há duas abordagens ao desenvolvimento de aplicativos de Silverlight com base em linguagem dinâmicos:

  • A abordagem tradicional usando o utilitário de desenvolvimento Chrion.exe
  • A abordagem apenas texto usando o script de navegador in-line

Neste artigo, eu fornecerá uma visão geral de ambas as abordagens e, em seguida, irá desenvolver um aplicativo de Microsoft Bing mapas de amostra usando a abordagem mais recente do texto apenas.

Desde o lançamento do Silverlight 2, junto com as bibliotecas de scripts do DLR, a Microsoft forneceu um dinâmico idioma Silverlight aplicativo desenvolvimento ambiente por meio do utilitário de desenvolvimento Chiron.exe e IronRuby e o IronPython Silverlight modelos de projeto de aplicativo.

Para começar, faça o download e instale o DLR e IronRuby ou IronPython dos sites mencionados anteriormente. Exemplos, documentação, utilitários e alguns componentes importantes adicionais são instalados com IronRuby e IronPython.

Os modelos do Silverlight para linguagens dinâmicas fornecem arquivos do aplicativo principal, que estão disponíveis em pastas Silverlight\script\templates\ruby e Silverlight\script\templates\python. Figura 1 mostra alguns detalhes sobre esses arquivos de modelo de aplicativo.

Figura 1 Arquivos de núcleo para aplicativos de Silverlight baseados em linguagem dinâmica

IronRuby IronPython instalado com IronRuby IronPython instalado independentemente Descrição
index.HTML index.HTML index.HTML Hospeda o aplicativo do Silverlight com base em linguagem dinâmico.
app\app.rb app\app.py python\app.py Arquivo de inicialização principal para o aplicativo do Silverlight.
app\app.XAML app\app.XAML python\app.XAML Arquivo principal XAML da interface do usuário.
css\screen.CSS css\screen.CSS stylesheets\screen.cs Define os estilos de aplicativo.
Não fornecido Não fornecido stylesheets\error.CSS Define o formato e estilos de erro do aplicativo. 
js\error.js js\error.js javascripts\error.js Gerencia os erros de aplicativos sem tratamento.

A pasta de script inclui o arquivo sl.bat, que irá ajudá-lo a criar uma preliminares dinâmicas com base no idioma Silverlight aplicativo. A seguir mostra o formato de linha de comando:

sl [ruby|python] <ApplicationPath>

Chiron.exe, o utilitário de desenvolvimento do Silverlight, empacota dinamicamente um conjunto de arquivos em um arquivo .xap para deployment. (Para mais informações sobre Chiron.exe e compilação, consulte blog.jimmy.schementi.com/2009/03/State-of-DLR-for-Silverlight.HTML.)

Você pode iniciar um aplicativo usando Chiron.exe com a opção /b (navegador):

Chiron /b

Um dos recursos interessantes do Chiron.exe é que sempre que você modificar um arquivo no diretório do aplicativo, Chiron.exe irá remontar o aplicativo em um .xap e recarregá-lo.Ainda será necessário atualizar todas as sessões de navegador ativo, porém.

A abordagem de texto Just

A abordagem de desenvolvimento baseadas no DLR tradicional faz usando o utilitário Chrion.exe obrigatório e segue o antigo modelo de desenvolvimento da atualização de compilação de edição.

Agora é possível escrever código XAML, IronPython e IronRuby em (marcação HTML X) diretamente no navegador (consulte IronRuby.com/browser para obter detalhes).Isso é chamado de abordagem apenas texto.Não há necessidade de instalar qualquer componente para criar e executar o aplicativo baseado no DLR.A abordagem apenas texto segue o modelo de desenvolvimento da atualização de salvamento de gravação e elimina a necessidade de Chrion.exe.

Com a abordagem apenas texto, você Don precisa nem mesmo cópias locais do DLR scripts assemblies, juntamente com os assemblies específicos de idioma IronRuby e IronPython mencionados anteriormente.Embora o Gestalt exemplo de pacote disponível de IronRuby.com/browser contém os binários, você também pode fazer referência a dlr.js de um servidor conhecido e que requer que você tenha nada instalado.No entanto, você precisa de uma maneira de controles do Silverlight host e permitem a integração do DLR dentro da página HTML.

Projeto Gestalt explora a abordagem Silverlight.js existente, que usa a API JavaScript para criar a marca do objeto que hospeda o controle do Silverlight.Ele também permite o gerenciamento de erro e detectar os requisitos de plug-in Silverlight na máquina cliente e navegador.A equipe de laboratório online MIX Silvelright.js arquivo para incluir scripts in-line e recursos de integração do DLR aprimorados e renomeado o arquivo como dlr.js.

Para começar, o projeto Gestalt fornece a biblioteca, plataformas desenvolvida no DLR.Você pode obter o arquivo de biblioteca compactado, gestalt.zip, visitmix.com/Labs/gestalt/downloads.Figura 2 fornece detalhes sobre os arquivos principais incluídos no arquivo ZIP.

Figura 2 Principais arquivos de biblioteca para o método Text Just

Arquivo IronRuby Descrição
dlr\dlr.js Arquivo Silverlight.js aprimorado para hospedar o aplicativo do Silverlight com base no idioma dinâmico e habilitar scripts em páginas HTML in-line.
dlr\ gestaltmedia.js  Permite HTML5 vídeo e reprodução de áudio.
dlr\dlr.XAP Inclui o arquivo AppManifest.xaml que faz referência Microsoft.Scripting.slvx e aponta para Microsoft.Scripting.Silverlight.dll como um assembly do ponto de entrada.Também inclui languages.config para fornecer configuração.informações para DLR idiomas.
dlr\IronRuby.slvx Inclui os arquivos IronRuby.dll e IronRuby.Libraries.dll para permitir o desenvolvimento de aplicativos do Silverlight com base em IronRuby.
dlr\IronPython.slvx Inclui os arquivos IronPython.dll e IronPython.Modules.dll para permitir o desenvolvimento de aplicativos do Silverlight com base em IronPython.
dlr\ Microsoft.Scripting.slvx Inclui cinco DLR scripts assemblies (Microsoft.Scripting.dll, Microsoft.Scripting.Core.dll, Microsoft.Scripting.Silverlight.dll, Microsoft.Scripting.ExtensionAttribute.dll e Microsoft.Scripting.Debugging.dll) que fornecem o tempo de execução do ambiente de script, a ponte as linguagens dinâmicas com o Silverlight.
Exemplos/Getting.Started/*.HTML Exemplos de páginas da Web demonstrando embutido, XAML, IronPython e IronRuby recursos de scripting.

Observe que, do Silverlight 3, o recurso de extensões do Silverlight transparente permite aos desenvolvedores empacotar os arquivos de assembly comumente usadas como uma biblioteca reutilizável separada com uma extensão de nome de arquivo .slvx.Os arquivos .slvx podem ser implantados em um local comum na Internet ou local específico do cliente.Os arquivos necessários .slvx devem ser referenciados no arquivo AppManifest.xaml dentro da seção ExternalParts como um ExtensionPart com o caminho correto.

Papel excelente de Jimmy Schementi a abordagem apenas texto (IronRuby.com/browser/SL-back-to-Just-Text.PDF) fornece algumas orientações muito útil.Este documento detalha também como alterar as configurações padrão do DLR do arquivo dlr.js.

Você precisa de uma instância do servidor Web, como o IIS ou aplicativos da Web com script Apache para hospedar e executar o in-line baseadas no DLR.De gestalt.zip, coloque o dlr e Samplesfolders na raiz do servidor Web.Se você não instalar essas pastas na raiz do servidor Web, você precisará modificar o arquivo dlr.js apropriadamente.

Adicione tipos MIME para arquivos .rb, .py e .slvx, semelhante ao seguinte:

  • Para .rb e .py arquivos defina o tipo de MIME para: text/plain
  • Para .slvx arquivos definido o tipo de MIME como: application/octet-stream

Para validar o ambiente, visite a pasta Exemplos/get.started e procure o arquivo 05_final.html.A página da Web demonstra a IronPython, HTML e elementos gráficos baseados em XAML com recursos de integração de animação, como mostra a Figura 3.

image: Running the Gestalt Project’s Sample Application

Figura 3 Executando o aplicativo de exemplo do Project Gestalt

Silverlight, IronRuby e a abordagem de texto Just

Let’s começar definindo o esqueleto de um aplicativo baseado no DLR Silverlight usando IronRuby, seguindo o método texto apenas.Depois que você copie os arquivos Gestalt para a raiz do servidor da Web, abra um editor de texto e comece a gravar o arquivo HTML.É simples!

É a coisa boa, dlr.js adiciona um controle do Silverlight para a página e fornece todos os requisitos básicos necessários para habilitar os recursos de integração de linguagem dinâmica.Para isso, basta inclua o arquivo dlr.js na página HTML:

<head>
  <script src="/dlr/dlr.js" type="text/javascript"></script> 
</head>

Observe que incluindo dlr.js irá definir as configurações padrão para seu aplicativo do Silverlight baseada no DLR. Se você quiser personalizar as configurações, você precisará substituir os padrões escrevendo código de script personalizado dentro do arquivo HTML. Para obter detalhes, consulte o papel de Jimmy Schementi mencionado anteriormente.

Agora você está definidos para escrever o código XAML e IronRuby ou IronPython no arquivo HTML, dentro de uma marca de script. Para gravar em linha de código em IronRuby, você precisará adicionar a marca de script com as informações de tipo e a classe apropriadas e lugar o código do IronRuby dentro da tag da seguinte forma:

<script type="application/ruby" 
  class="Class Name Goes Here"> 
  IronRuby Code Goes Here
</script>

Para escrever código de IronPython in-line, basta fazer o mesmo com as substituições apropriadas:

<script type="application/python" 
  class="Class Name Goes Here"> 
  IronPython Code Goes Here
</script>

Para escrever código embutido a XAML, adicione a marca de script com as informações apropriadas de tipo, ID, largura e altura e coloque o código XAML na tag:

<script type="application/xml+xaml" id="Place ID here" 
  Width="400" Height="400"> 
  <UserControl ...>
    XAML Code Goes Here
  </UserControl>
</script>

Você pode acessar os controles XAML e implementar a integração de eventos usando código, o que demonstrarei durante o desenvolvimento do aplicativo na próxima seção. Quando você termina com o código, procure apenas a página e você deverá ver o resultado de aplicativo imediatamente.

Bing mapa Integration

Agora que você já viu o esqueleto básico do aplicativo do Silverlight dynamic language usando embutido abordagem apenas texto de script, let’s utilizá-lo em uma etapa posterior com a integração do Microsoft Bing mapas (anteriormente conhecido como Virtual Earth).

Microsoft Bing mapas SDK do Silverlight controle versão 1 foi lançado em novembro de 2009 (MSDN.Microsoft.com/Library/ee681884). O instalador é chamado BingMapsSilverlightControlv1.0.1Installer.msi. Observe que você precisa de pelo menos 3 do Silverlight para trabalhar com esse controle. A instalação inclui Microsoft.Maps.MapControl.dll e Microsoft.Maps.MapControl.xml, Microsoft.Maps.MapControl.Common.dll e Microsoft.Maps.MapControl.Common.xml e documentação off-line.

Antes de iniciar a criação de aplicativos usando o controle do Silverlight Bing mapas, você deve criar uma conta Bing mapas Developer para receber a chave de autenticação do aplicativo. Para fazer isso, visite bingmapsportal.com.

O controle Microsoft Bing mapas Silverlight versão CTP estava disponível antes do lançamento da versão 1 do SDK. Existem alterações consideráveis e aperfeiçoamentos na versão 1 comparados com a versão CTP. See MSDN.Microsoft.com/Library/ee681889 para entender a chave de diferenças entre o CTP e a versão versões 1.

Agora crie um arquivo SilverlightMap.html e incluir o arquivo dlr.js conforme descrito na seção anterior.

Você precisa modificar o arquivo AppManifest.xaml (disponível no arquivo dlr.xap) e incluir Microsoft.Maps.MapControl.dll e Microsoft.Maps.MapControl.Common.dll arquivos para carregar como parte do aplicativo de inicialização. Para fazer isso, renomeie dlr.xap para dlr.xap.zip e extraia os arquivos AppManifest.xaml e languages.config do arquivo. Em seguida, adicione arquivos Microsoft.Maps.MapControl.dll e Microsoft.Maps.MapControl.Common.dll como AssemblyPart, conforme mostrado no Figura 4.

Figura 4 Arquivo AppManifest.xaml modificado

<Deployment
  xmlns="http://schemas.microsoft.com/client/2007/deployment"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  RuntimeVersion="2.0.31005.0"
  EntryPointAssembly="Microsoft.Scripting.Silverlight"
  EntryPointType="Microsoft.Scripting.Silverlight.DynamicApplication"
  ExternalCallersFromCrossDomain="ScriptableOnly">
  <Deployment.Parts>
    <AssemblyPart Source="Microsoft.Maps.MapControl.dll" />
    <AssemblyPart Source="Microsoft.Maps.MapControl.Common.dll" />
  </Deployment.Parts>
  <Deployment.ExternalParts>
    <ExtensionPart Source="Microsoft.Scripting.slvx" />
  </Deployment.ExternalParts>
</Deployment>

Agora zip até AppManifest.xaml modificado, langugages.config existente, arquivos Microsoft.Maps.MapControl.dll e Microsoft.Maps.MapControl.Common.dll e renomeie o arquivo .zip para dlr.xap. Substitua o arquivo dlr.xap existente (sob a pasta dlr) no servidor Web com o novo nome.

Em seguida, abra o arquivo SilverlightMap.html, adicionar a marca de script para o código XAML e adicione o UserControl com o nome Silverlight_map e uma referência ao controle de mapa para criar o espaço para nome necessário (consulte Figura 5).

Figura 5 Controles de mapa de referência no arquivo HTML

<Deployment 
  xmlns="http://schemas.microsoft.com/client/2007/deployment" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  RuntimeVersion="2.0.31005.0" 
  EntryPointAssembly="Microsoft.Scripting.Silverlight" 
  EntryPointType="Microsoft.Scripting.Silverlight.DynamicApplication"
  ExternalCallersFromCrossDomain="ScriptableOnly">
  <Deployment.Parts>
    <AssemblyPart Source="Microsoft.Maps.MapControl.dll" />
    <AssemblyPart Source="Microsoft.Maps.MapControl.Common.dll" />
  </Deployment.Parts>
  <Deployment.ExternalParts>
    <ExtensionPart Source="Microsoft.Scripting.slvx" />
  </Deployment.ExternalParts>
</Deployment>
<script type="application/xml+xaml" id="sl_map" 
  Width="1350" Height="575">
  <UserControl x:Name="silverlight_map" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="200" 
    Height="280" Background="Black" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    xmlns:m="clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl">
</UserControl>
</script>

Por fim, adicione o controle Canvas como o principal contêiner e no elemento Map sob o controle de grade. Observe que eu mantido a mesma largura e altura da tela e grade controla e defina as propriedades width e height do mapa de controle para 800 e 400, respectivamente:

<Canvas x:Name="container" Width="1350" Height="575">
<Grid x:Name="layout_root" Width="1350" Height="575">    
<m:Map CredentialsProvider="AuthenticationKey" 
  Width="800" Height="400" Grid.Column="1" 
  HorizontalAlignment="Center"/>
</Grid>
</Canvas>
</UserControl>

Os trechos de código mostrados aqui, você precisará substituir “ AuthenticationKey ” com sua chave de autenticação para o controle do mapa.

Copie o arquivo para a pasta Sample/Getting.started existente no servidor Web e navegar na página. Você deve ver o mapa com o modo de caminho padrão (consulte Figura 6).

image: DLR-Based Bing Map Silverlight Application in Default Road Map Mode

Figura 6 Baseadas no DLR Bing Silverlight de mapa de aplicativo no modo padrão Road Map

Modos de mapa e animação 3D

Let’s alterar o modo de mapa para aéreas com rótulos como o modo de exibição padrão. Let’s também introduzir animação 3D para o mapa.

Para alterar o modo de mapa padrão, primeiro nomeie no elemento Map (neste exemplo, eu usado map_in_ironruby), de modo que ela possa ser referenciada no código embutido com base em IronRuby. Eu também irá aplicar projeção 3D o objeto de mapa. Esse era um recurso novo no Silverlight 3. Para fazer que defini a propriedade de projeção do objeto de mapa para PlanProjection e defini a propriedade RotationX para 20. Isso transforma o objeto de mapa, oferecendo um ângulo de visualização inclinada ligeiramente:

<Grid x:Name="layout_root" Width="1350" Height="575" Background="Black">    
  <m:Map x:Name="map_in_ironruby" 
  CredentialsProvider="AuthenticationKey" 
  Width="800" Height="400">
    <m:Map.Projection>
      <PlaneProjection RotationX="-20"/>
    </m:Map.Projection>   
  </m:Map>
</Grid>

Observe que também alterei o plano de fundo da grade de preto.

Agora adicionar a marca de script para IronRuby e escrever as seguintes linhas de código para incluir os assemblies necessários (inclusive MapControl.dlls) e ligue aérea com rótulos para o controle do mapa.

Observe que com a nova abordagem texto apenas, posso fazer referência do objeto de mapa pelo nome. Na versão atual de bibliotecas Gestalt, você precisa referenciar objetos com me ou xaml abreviada (aqui usei a me abreviada). No futuro, elementos XAML com o conjunto x: Name podem ser acessados por meio de root_visual abreviada:

<script type="application/ruby" class="sl_map">
  require "Microsoft.Maps.MapControl.dll"
  require "Microsoft.Maps.MapControl.Common.dll"
  include System::Windows
  include System::Windows::Controls
  include Microsoft::Maps::MapControl
  sm = me.silverlight_map
  sm.map_in_ironruby.mode = AerialMode.new(true) 
</script>

Observe que eu sempre o nome da classe da marca do script IronRuby relacionados como sl_map, que é semelhante para a identificação da marca de script de XAML.

Agora, se você executar o aplicativo, você verá o plano de fundo preto, inclinada ângulo 3D e rotulado aérea, conforme mostrado no Figura 7.

image: Map Mode Set to Aerial with Labels Mode and with 3-D Projection

Figura 7 Mapear set mode para Vista Aérea com o modo de etiquetas e com projeção 3D

Uma demonstração popular na conferência MIX09 foi Silverlight e o Microsoft Bing Map integração com girando os recursos para o objeto de mapa. Let’s implementar algo semelhante no IronRuby.

Para implementar esse recurso, você precisa primeiro definir a grade com duas colunas usando ColumnDefinitions:

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="200"/>
  <ColumnDefinition Width="1100"/>
</Grid.ColumnDefinitions>

Em seguida, adicione três botões chamados mapa de girar, pausar, parar e redefinir, juntamente com o texto de título no arquivo XAML dentro da borda. Tudo isso é na primeira coluna na grade de (consulte Figura 8).

Figura 8 Adicionando controles para o objeto de grade

<StackPanel Grid.Column="0" Orientation="Vertical">
  <Border CornerRadius="20" Margin="0,50,0,5" Width="150" 
    Background="DarkBlue" HorizontalAlignment="Center">
    <StackPanel Orientation="Vertical">
      <TextBlock Text="3D Rotation"
        HorizontalAlignment="Center"
        FontSize="12" Foreground="White" Margin="0,5,0,10"/>
      <Button x:Name="RotateMap" Height="25"
        Content="rotate_map" Width="100" Margin="0,0,0,10"
        Foreground="Black" VerticalAlignment="Center"
        HorizontalAlignment="Center" />
      <Button x:Name="pause_resume" Height="25"
        Content="Pause" Background="DarkGoldenrod"
        Foreground="Black" Width="100" Margin="0,0,0,10"
        VerticalAlignment="Center"
        HorizontalAlignment="Center" />
      <Button x:Name="stop_reset" Height="25"
        Content="Stop and Reset" Background="DarkGoldenrod"
        Foreground="Black" Width="100" Margin="0,0,0,10"
         VerticalAlignment="Center"
         HorizontalAlignment="Center" />
    </StackPanel>
  </Border>
</StackPanel>

Agora adicione o objeto de mapa à segunda coluna da grade de:

<m:Map x:Name="map_in_ironruby" 
  CredentialsProvider="AuthenticationKey" 
  Width="800" Height="400" Grid.Column="1" 
  HorizontalAlignment="Center">
  <m:Map.Projection>
    <PlaneProjection RotationX="-20" RotationY="0" 
      RotationZ="0"/>
  </m:Map.Projection>
</m:Map>

Na próxima etapa, você precisará criar algum código de atualização XAML bastante complexo. É recomendável criar o arquivo XAML usando um ambiente de desenvolvimento, como o Visual Studio ou o Expression Blend para tirar proveito dos seus recursos do IntelliSense e edição. Em seguida, você pode copiar o XAML concluído no arquivo app.xaml do seu projeto.

Crie um storyboard com o map_animation nome direcionada para o objeto de mapa chamado map_in_ironruby. (Um trecho é exibido em Figura 9. Consulte o código de download para este artigo para todo o bloco de código do storyboard.). O storyboard define os quadros-chave para as propriedades de animação PlaneProjection RotationZ, RotationY, GlobalOffsetX e GlobalOffsetZ. Adicione o StoryBoard como um recurso de UserControl.

Figura 9 Criando o storyboard para animação

<StackPanel Grid.Column="0" Orientation="Vertical">
  <Border CornerRadius="20" Margin="0,50,0,5" Width="150" 
    Background="DarkBlue" HorizontalAlignment="Center">
    <StackPanel Orientation="Vertical">
      <TextBlock Text="3D Rotation" 
        HorizontalAlignment="Center" 
        FontSize="12" Foreground="White" Margin="0,5,0,10"/>
      <Button x:Name="RotateMap" Height="25"
        Content="rotate_map" Width="100" Margin="0,0,0,10" 
        Foreground="Black" VerticalAlignment="Center" 
        HorizontalAlignment="Center" />
      <Button x:Name="pause_resume" Height="25" 
        Content="Pause" Background="DarkGoldenrod" 
        Foreground="Black" Width="100" Margin="0,0,0,10" 
        VerticalAlignment="Center" 
        HorizontalAlignment="Center" />
      <Button x:Name="stop_reset" Height="25" 
        Content="Stop and Reset" Background="DarkGoldenrod" 
        Foreground="Black" Width="100" Margin="0,0,0,10" 
        VerticalAlignment="Center" 
        HorizontalAlignment="Center" />
    </StackPanel>
  </Border>
</StackPanel>
<UserControl.Resources>
  <Storyboard x:Name="map_animation">
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
      Storyboard.TargetName="map_in_ironruby" 
      Storyboard.TargetProperty=
        "(UIElement.Projection).(PlaneProjection.RotationZ)">
      <EasingDoubleKeyFrame KeyTime="00:00:00" Value="15"/>
      <EasingDoubleKeyFrame KeyTime="00:00:01" Value="0"/>
      <EasingDoubleKeyFrame KeyTime="00:00:02" Value="-15"/>
      <EasingDoubleKeyFrame KeyTime="00:00:03" Value="0"/>
      <EasingDoubleKeyFrame KeyTime="00:00:04" Value="15"/>
    </DoubleAnimationUsingKeyFrames>
    ...
  </Storyboard>
</UserControl.Resources>

A próxima etapa é adicionar os eventosClick para o código em IronRuby para iniciar, pausar, continuar e parar a animação embutido. Primeiro você precisa adicionar uma referência ao System.Windows.Media e System.Windows.Media.Animation:

include System::Windows::Media
include System::Windows::Media::Animation

Desative o botão pause_resume durante o processo de inicialização do aplicativo:

sm.pause_resume.is_enabled = false

Implementar o evento Click de cada botão. Iniciar com o botão rotate_map. Primeiro defina o objeto de mapa para alinhamento horizontal à esquerda para melhor utilizar o espaço disponível para a animação. Em seguida, defina a propriedade RepeatBehavior da animação StoryBoard para contínuo e começar a animação. Finalmente, habilitar o botão pause_resume e definir o conteúdo do botão para pausar:

sm.rotate_map.click do |s,e|
  sm.map_in_ironruby.horizontal_alignment = HorizontalAlignment.Left
  sm.map_animation.repeat_behavior = RepeatBehavior.Forever
  sm.map_animation.begin
  sm.pause_resume.is_enabled = true
  sm.pause_resume.content = "Pause"  
end

Em seguida, implementar o botão pause_resume Click evento. Aqui, dependendo se você estiver em um estado pausado ou estado de execução, desejar continuar ou pausar a animação do storyboard e alterar o conteúdo de botão:

sm.pause_resume.click do |s,e|
  strbtnContent = sm.pause_resume.content.ToString
  if strbtnContent == "Pause" 
    sm.pause_resume.content = "Resume"
    sm.map_animation.pause
  else
    sm.pause_resume.content = "Pause"
    sm.map_animation.resume
  end
end

Por fim, implementar o botão stop_reset clique evento. Aqui você parar a animação de storyboard, desativar o botão pause_resume e redefinir o conteúdo do botão para pausar. Você também redefinir o alinhamento do objeto de mapa:

sm.stop_reset.click do |s,e|
  sm.map_animation.stop
  sm.pause_resume.is_enabled = false
  sm.pause_resume.content = "Pause"
  sm.map_in_ironruby.horizontal_alignment = HorizontalAlignment.Center   
end

Compilar e executar o projeto usando Chiron /b comando para ver o mapa com animação. Figura 10 mostra o mapa de rotação.

image: 3-D Map Animation

Figura 10 Animação 3D do mapa

Direcionamento de locais predefinidos

Agora let’s realçar três locais predefinidos do mapa: Nova Iorque, SAN Francisco e Vancouver. Isso é demonstrado no translation from VPE for Csharp como parte da documentação do controle do Microsoft Bing mapa para o CTP do Silverlight. Vou mostrar como implementar esse recurso usando IronRuby.

Primeiro você precisa atualizar o código embutido XAML para adicionar três botões adicionais em uma nova seção no lado esquerdo da tela, uma para cada local — Nova Iorque, SAN Francisco e Vancouver. Eles são implementados bem como os botões anteriores. Uma alteração notável é a adição do atributo etiqueta para cada elemento de botão. O atributo de tag define coordenadas de local específico e o nível de zoom do mapa.

O trecho de código a seguir mostra o código XAML para adicionar um botão para o local de Nova York:

<Button x:Name="newyork" Height="25"    Width="100"
  Content="New York" Margin="0,0,0,10" Foreground="Black" 
  VerticalAlignment="Center" HorizontalAlignment="Center" 
  Tag="40.7199,-74.0030,0.0000 12.0000"/>

Esse atributo fornece as informações de coordenadas para cada local. Quando o usuário clica no botão, essa informação é usada para redirecionar o mapa. Consulte o código de download para o código de botões de localizador de local inteiro.

A maioria dos aplicativos tem um título, e isso deve ser não é diferente. Adicionei o título “ Microsoft Bing mapas Silverlight Control e IronRuby Integration ” na segunda coluna da grade de substituindo no elemento Map existente para colocá-lo em StackPanel junto com o controle TextBlock título:

<StackPanel Grid.Column="1" Orientation="Vertical">
  <TextBlock VerticalAlignment="Top" 
    HorizontalAlignment="Center" FontSize="20" 
    Foreground="Red" Margin="0,5,0,0"
    Text="Microsoft Bing Maps Silverlight Control and IronRuby Integration" />
  <m:Map x:Name="map_in_ironruby" Width="800" Height="400" 
    HorizontalAlignment="Center" Margin="0,50,0,20">
...

Agora a camada de apresentação é concluída. Se você executar o aplicativo neste momento, você deve ver os três botões adicionais na seção localizar localização nova. No entanto, o mapa não será movido para o local correspondente se você clicar em qualquer um dos botões recém-adicionados. Para que você precisa implementar o code-behind para cada botão Click evento.

Os eventos Click são as mesmas para todos os três botões. Base o valor da propriedade tag do botão clicado correspondente, passar naquelas coordenadas e nível de zoom como a especificação do modo de exibição para criar o novo modo de exibição de mapa. Aqui, usei o método de divisão para dividir as coordenadas e o nível de zoom e defina o modo de visualização do mapa usando o método SetView do controle mapas. O novo modo de exibição de mapa mostrará o local definido:

sm.newyork.click    do |s,e|      
  tag_information = s.Tag.split
  location_Converter = LocationConverter.new
  location_info = location_Converter.ConvertFrom(tag_information[0].ToString)
  sm.map_in_ironruby.SetView(location_info, tag_information[1]);
end

Você também precisará adicionar a referência Microsoft.Maps.MapControl.Design para o programa para criar um novo modo de exibição do mapa.

include Microsoft::Maps::MapControl::Design

E é o aplicativo concluído. Como você pode ver, seria fácil de personalizar os modos de exibição, adicionar outros destinos de localização e implementar recursos adicionais.

Seguindo em frente

Antes de concluir o artigo, eu gostaria de apresentar rapidamente o externalizing embutido script (XAML e IronRuby/IronPython) método do código.

Para modularizar seu modelo de programação, primeiro copie o arquivo SilverlightMap.html final e renomeá-lo para SilverlightMap ExternalScript.html. Em seguida, recorte e cole o código XAML in-line do arquivo SilverlightMap ExternalScript.html para um novo arquivo de texto em branco e salvar como arquivo SilverlightMap.xaml. Em seguida, recortar e colar o código do IronRuby do arquivo SilverlightMap ExternalScript.html para o novo arquivo de texto em branco e salvar como arquivo SilverlightMap.rb.

Atualize agora, as marcas de script XAML e IronRuby do arquivo SilverlightMap ExternalScript.html com o atributo src definindo o caminho dos arquivos XAML e IronRuby externos:

<html><head>
  <script src="/dlr/dlr.js" type="text/javascript"></script> 
</head>
<body>
  <script type="application/xml+xaml" 
    src="/samples/getting.started/SilverlightMap.xaml" 
    id="sl_map" Width="1350" Height="575">
  </script>
  <script type="application/ruby" 
    src="/samples/getting.started/SilverlightMap.rb" 
    class="sl_map">
  </script>
</body> </html>

Por fim, copie três novos arquivos — SilverlightMap ExternalScript.html, SilverlightMap.xaml e SilverlightMap.rb—to na pasta do servidor Web Sample/Getting.started. Agora, se você procurar o arquivo SilverlightMap ExternalScript.html, você terá o mesmo mapa rotação com os recursos de localização local.

Visite SilverlightStuff.net ler meu artigo sobre o mesmo aplicativo criado usando a abordagem tradicional (usando Chiron.exe).

Ashish Ghoda é fundador e presidente da Technology LLC opinião e associar Diretor em uma grande quatro empresa de contabilidade. Visite seus sites technologyopinion.com and SilverlightStuff.netou contato Ghoda diretamente no AskAshish@technologyopinion.com.

Graças aos seguintes especialistas técnicos para revisar este artigo: Laurence Maroney e Jimmy Schementi