Il presente articolo è stato tradotto automaticamente.

.NET dinamico

Creazione di mappe interattive di Bing con Silverlight e IronRuby

Ashish Ghoda

Una delle caratteristiche più importanti di Silverlight è il supporto per linguaggi dinamici quali IronPython e IronRuby. Questa funzionalità di integrazione consente lo sviluppo di applicazioni di Internet Rich (RIA) utilizzando la piattaforma Silverlight, XAML per il livello di presentazione e linguaggi dinamici per il code-behind. In questo articolo viene spiegato la funzionalità di integrazione di Silverlight con linguaggi dinamici e i controlli Microsoft Bing Map. Potrà iniziare con una panoramica generale dei linguaggi dinamici, quindi addentrarci nel supporto di Silverlight per queste lingue. È possibile concludere viene mostrato come creare un'interattiva 3D animata ricerca percorso applicazione Silverlight utilizzando il controllo Microsoft Bing mappa Silverlight e IronRuby.

Nozioni fondamentali di linguaggio dinamico

Gli ambienti di lettura-Eval-Print Loop (REPL) forniscono lightweight “ riprodurre man mano ” funzionalità di programmazione per gli sviluppatori mediante l'utilizzo di che cosa sono noti come linguaggi di programmazione dinamici, ovvero linguaggi tipizzati in modo dinamico e compilate in fase di esecuzione. Non è necessario dichiarare le variabili dei tipi di dati specifico. Tutto ciò che viene gestita da Common Language runtime tramite il contesto di espressioni.

Le lingue più familiare, ad esempio C# e Visual Basic sono linguaggi tipizzati in modo statico che sono più rigide di natura. Sviluppo e distribuzione utilizzando linguaggi dinamici è più semplice rispetto a tali linguaggi statici, che richiedono la compilazione e distribuzione di output. Tuttavia, è necessario eseguire la corretta convalida e test di indipendenza dai tipi quando si utilizza in modo dinamico digitato lingue.

Con linguaggi dinamici, creare una funzione e assegnare a una variabile oppure passarlo come parametro a un'altra funzione. Ciò semplifica chiusure e le funzioni passando come parametri. In generale, le due caratteristiche definizione di chiusure sono la possibilità di assegnare un blocco di codice (funzione) a una variabile e questo blocco di capacità del codice per mantenere l'accesso alle variabili che fosse accessibile in cui è stato creato.

Il seguente metodo ShortWords tradizionale in C# restituisce un subset di un elenco di parole che corrispondono ai criteri di lunghezza massima parola di un massimo di tre lettere:

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);
}

Con LINQ, è possibile ottenere una funzionalità simile in modo molto più efficace come si può vedere nel frammento di codice riportato di seguito:

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

Implementazione del metodo stesso in un linguaggio dinamico, ad esempio IronRuby, ovvero un'implementazione del linguaggio di programmazione trascrizione per Microsoft .NET Framework, è simile all'approccio di LINQ C# ed è significativamente inferiore l'approccio tradizionale:

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

Confronto solo di questi due implementazioni dell'algoritmo stesso rivela fondo IronRuby (e i linguaggi dinamici in generale). Il codice IronRuby è conciso e non è possibile visualizzare dati di digitare la parola chiave, ad esempio string o int.

L'aspetto più interessante di questo blocco di codice IronRuby è la chiusura che si trovano tra le parentesi graffe. Qui la chiusura essenzialmente una funzione viene passata al metodo di selezione. Il metodo di selezione utilizza una chiusura per estrarre un sottoinsieme di un insieme. Il codice che costituisce la chiusura viene effettivamente eseguito all'interno del metodo select (in questo caso, la chiusura estrae le stringhe all'interno dell'elenco di parole insieme che soddisfano il criterio), mantenendo l'accesso alle variabili nel proprio ambito originale (in questo caso, la variabile maximumWordLength).

Chiusure sono molto più potenti di seguito viene illustrato questo semplice esempio. Sono simili per l'utilizzo di LINQ o passando un delegato a un metodo, ad esempio EXISTS o trova in C#, con l'ulteriore vantaggio di conservare l'accesso al proprio ambito originale. È possibile ottenere ulteriori dettagli su chiusure dal libro che ho scritto con Jeff Scanlon, “ Accelerated Silverlight 3 ” (Apress, luglio 2009).

Linguaggi dinamici per Silverlight

Silverlight supporta attualmente i linguaggi dinamici IronRuby e IronPython tramite il modulo di gestione Microsoft DLR (Dynamic Language Runtime), ovvero una piattaforma generico e il modello di hosting per linguaggi dinamici per l'esecuzione su Microsoft .NET Framework Common Language Runtime (CLR).

DLR è un insieme di librerie .NET Framework e dei servizi individuare tipi in fase di esecuzione tramite reflection, in modo dinamico in modo che il codice scritto in linguaggi dinamici può essere eseguito sulla piattaforma. NET.

Esistono cinque DLR assembly script che forniscono l'ambiente di scripting runtime, ovvero bridging linguaggi dinamici con Silverlight:

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

Microsoft.Scripting.Silverlight.dll contiene classi che consentono agli sviluppatori di scrivere applicazioni Silverlight utilizzando linguaggi dinamici. Una delle classi principali è DynamicApplication, eredita direttamente dalla System.Windows.Application. Questa classe rappresenta l'oggetto applicazione basata su Silverlight dinamiche fornendo un accesso agli elementi visivi da codice linguaggio dinamico, come un punto di ingresso per le applicazioni di linguaggio dinamico di host negli host Silverlight. Tale proprietà provides aggiuntive che estendono le proprietà di host, risorse e RootVisual già fornite dalla classe applicazione.

IronRuby (IronRuby.NET) è un'implementazione open source trascrizione linguaggio di programmazione che fornisce l'integrazione tra Ruby e .NET Framework.

La versione corrente di IronRuby (1.0-rc1) supporta .NET Framework 3.5 e la versione beta di .NET Framework 4. Si noti che IronRuby 1.0-rc1 fornisce zip e MSI download. Per le applicazioni Silverlight, è preferibile utilizzare la versione di ZIP.

(IronPythonIronPython.CodePlex.com) è un'implementazione open source di Python il linguaggio che come IronRuby, consente l'integrazione del linguaggio Python con .NET Framework di programmazione. Attualmente è possibile scaricare IronPython 2.6 per .NET Framework 3.5 e la versione beta di .NET Framework 4.

IronRuby e IronPython avere due assembly che supportano il linguaggio specifico, che fornisce funzionalità quali l'analisi della lingua e la comunicazione con l'ambiente host. Sono IronPython.dll e IronRuby.Libraries.dll per IronRuby e IronPython.Modules.dll per IronPython e IronRuby.dll.

Si noti che IronRuby e IronPython sono in continuo sviluppo. Visitare le pagine iniziali per accedere alle versioni più recenti e documentazione. È inoltre possibile ottenere il codice sorgente correlati, con il codice sorgente di DLR, visitando DLR.CodePlex.com.

Installazione dei componenti di sviluppo

Esistono due approcci per lo sviluppo di applicazioni Silverlight basato sul linguaggio dinamiche:

  • L'approccio tradizionale utilizzando l'utilità di sviluppo Chrion.exe
  • L'approccio di testo appena utilizzando script inline browser

In questo articolo viene fornita una panoramica di entrambi gli approcci e quindi sviluppare un'applicazione di Microsoft Bing Maps esempio utilizzando l'approccio di testo appena più recente.

Dall'introduzione di Silverlight 2, insieme alle librerie di script di DLR, Microsoft ha fornito un dinamico basati sul linguaggio Silverlight ambiente di sviluppo di applicazioni tramite le utilità di sviluppo Chiron.exe e modelli di progetto di applicazione IronRuby e IronPython Silverlight.

Per iniziare, scaricare e installare il DLR e IronRuby o IronPython da siti menzionati in precedenza. Gli esempi, documentazione, utilità e alcuni altri importanti componenti vengono installati insieme a IronRuby e IronPython.

I modelli di Silverlight per i linguaggi dinamici forniscono i file dell'applicazione principale, che sono disponibili in cartelle Silverlight\script\templates\ruby e Silverlight\script\templates\python. Nella figura 1 mostra alcuni dettagli su questi file di modello dell'applicazione.

Figura 1 File principali per Dynamic Language Silverlight Applications

IronRuby IronPython installati con IronRuby IronPython installato separatamente Description
index.HTML index.HTML index.HTML Ospita l'applicazione Silverlight basato sul linguaggio dinamico.
app\app.RB app\app.py python\app.py File di avvio principale per l'applicazione Silverlight.
app\app.XAML app\app.XAML python\app.XAML File dell'interfaccia utente XAML principale.
css\screen.CSS css\screen.CSS stylesheets\screen.cs Definisce gli stili di applicazione.
Non disponibile Non disponibile stylesheets\error.CSS Definisce gli stili di errore dell'applicazione e il formato. 
js\error.js js\error.js javascripts\error.js Gestisce gli errori dell'applicazione non gestita.

La cartella script include il file sl.bat, che consentirà di creare una preliminare dinamica basati sul linguaggio di applicazione Silverlight. Di seguito viene illustrato il formato della riga di comando:

sl [ruby|python] <ApplicationPath>

Chiron.exe, l'utilità di sviluppo di Silverlight, pacchetti in modo dinamico un insieme di file in un file con estensione xap di distribuzione. Per ulteriori informazioni e la compilazione di Chiron.exe, vedere (blog.Jimmy.schementi.com/2009/03/state-of-DLR-for-Silverlight.HTML.)

È possibile avviare un'applicazione utilizzando Chiron.exe con l'opzione /b (browser):

Chiron /b

Una delle funzionalità di Chiron.exe interessante è che ogni volta che si modifica un file all'interno della directory dell'applicazione Chiron.exe verrà rigenerare l'applicazione in un XAP e ricaricarlo. Comunque è necessario aggiornare anche se le sessioni del browser attivo.

L'approccio di solo testo

L'approccio sviluppo tradizionale basato su DLR rende utilizzando l'utilità Chrion.exe obbligatoria e segue il vecchio modello di sviluppo modifica compilazione aggiornamento.

È ora possibile scrivere un codice IronPython, IronRuby e di XAML nel (codice HTML X) direttamente nel browser (vedere IronRuby.com/browser per informazioni dettagliate). L'approccio di testo appena viene chiamato. Non è necessario installare i componenti per creare ed eseguire l'applicazione basata su DLR. L'approccio di testo appena segue il modello di sviluppo scrittura salvataggio aggiornamento ed elimina la necessità di Chrion.exe.

Con l'approccio testo semplicemente non è ancora necessario copie locali di DLR script gli assembly con gli assembly specifici della lingua IronRuby e IronPython menzionati in precedenza. Tuttavia il Gestalt di esempio disponibile da pacchettoIronRuby.com/browser contiene i file binari, è anche possibile fare riferimento al dlr.js da un server conosciuto e che è necessario che sia disponibile non installato. Tuttavia, è necessario un modo per i controlli Silverlight e attivare l'integrazione di DLR all'interno della pagina HTML host.

Il progetto Gestalt converte in maiuscolo sull'approccio Silverlight.js esistente, che utilizza l'API JavaScript per creare il tag Object che ospita il controllo Silverlight. Consente inoltre di rilevare il browser e i requisiti di plug-in di Silverlight sul computer client e gestione di errore. Il team di missaggio Online Lab avanzata il Silvelright.js file da includere script inline e funzionalità di integrazione di DLR e rinominato il file come dlr.js.

Per iniziare, il progetto Gestalt offre la libreria multibrowser, multipiattaforma creata in DLR. È possibile ottenere il file della libreria compresso, gestalt.zip, da visitmix.com/Labs/gestalt/downloads. Nella figura 2 vengono fornite informazioni dettagliate sui file principali inclusi nel file zip.

Nella figura 2 File libreria di base per l'approccio di solo testo

File IronRuby Description
dlr\dlr.js File Silverlight.js avanzata di host dinamico language-based Silverlight dell'applicazione e attiva inline la script nelle pagine HTML.
dlr\ gestaltmedia.js  Consente la riproduzione audio e video HTML5.
dlr\dlr.xap Include il file AppManifest.xaml che fa riferimento a Microsoft.Scripting.slvx e punta Microsoft.Scripting.Silverlight.dll come a un assembly del punto di ingresso. Include inoltre languages.config per fornire la configurazione. informazioni per le lingue DLR.
dlr\IronRuby.slvx Include i file IronRuby.dll e IronRuby.Libraries.dll per consentire lo sviluppo di applicazioni basate su IronRuby Silverlight.
dlr\IronPython.slvx Include i file IronPython.dll e IronPython.Modules.dll per consentire lo sviluppo di applicazioni basate su IronPython Silverlight.
dlr\ Microsoft.Scripting.slvx Include cinque DLR script assembly (Microsoft.Scripting.dll, Microsoft.Scripting.Core.dll, Microsoft.Scripting.Silverlight.dll, Microsoft.Scripting.ExtensionAttribute.dll e Microsoft.Scripting.Debugging.dll) forniscono runtime ambiente di scripting, bridging linguaggi dinamici con Silverlight.
Esempi/Getting.Started/*.HTML Pagine Web di esempio che illustrano gli script, le funzionalità di IronPython, IronRuby e di XAML inline.

Nota da Silverlight 3, la funzionalità trasparente estensioni di Silverlight consente agli sviluppatori di assemblare i file di assembly comunemente utilizzati come una libreria riutilizzabile separata con un'estensione di nomefile .slvx. I file .slvx possono essere distribuiti su un percorso Internet comune o una posizione specifica del client. I file necessari .slvx necessario farvi riferimento nel file AppManifest.xaml all'interno della sezione ExternalParts come un ExtensionPart con il percorso corretto.

Eccellente paper di Jimmy Schementi sull'approccio testo appena (IronRuby.com/browser/SL-back-to-Just-Text.PDF) vengono fornite alcune informazioni molto utili. In questo documento viene inoltre illustrato come modificare le impostazioni di DLR predefinite del file dlr.js.

È necessario che un'istanza del server Web come IIS o Apache per host e il DLR basato su esecuzione inline inseriti nello script di applicazioni Web. Da gestalt.zip, posizionare il dlr e Samplesfolders nella directory principale del server Web. Se si sono di non installare queste cartelle nella directory principale del server Web, è necessario modificare il file dlr.js in modo appropriato.

Successivamente, aggiungere i tipi MIME per i file .rb, .py e .slvx, simile a quello riportato di seguito:

  • Per .rb e .py file impostare il tipo MIME: text/plain
  • Per .slvx file impostare il tipo MIME: Application/Octet-Stream

Per convalidare l'ambiente, visitare la cartella Esempi/get.started e individuare il file 05_final.html. Viene illustrata la pagina Web di IronPython, HTML e basati su XAML grafica con funzionalità di integrazione di animazione, come illustrato in Nella figura 3.

image: Running the Gestalt Project’s Sample Application

Nella figura 3 Esecuzione applicazione di esempio del progetto Gestalt

Silverlight, IronRuby e l'approccio di solo testo

Avviare Let’s definendo lo scheletro di un'applicazione basata su DLR Silverlight mediante IronRuby, seguendo l'approccio di testo appena. Una volta che è possibile copiare i file Gestalt a directory principale del server Web, è sufficiente aprire un editor di testo e iniziare a scrivere il file HTML. È semplice!

La cosa buona è dlr.js aggiunge un controllo Silverlight alla pagina e fornisce tutti i requisiti di base necessarie per attivare la funzionalità di integrazione dei linguaggi dinamici. Per questo, includere semplicemente il file dlr.js nella pagina HTML:

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

Si noti che inclusi dlr.js configurerà le impostazioni predefinite per l'applicazione Silverlight basati su DLR. Se si desidera personalizzare le impostazioni, è necessario eseguire l'override delle impostazioni predefinite mediante la scrittura di codice di script personalizzato all'interno del file HTML. Per ulteriori informazioni, vedere il white paper di Jimmy Schementi menzionato in precedenza.

A questo punto sono impostati per scrivere il codice XAML e IronRuby o IronPython nel file HTML all'interno di un tag di script. Per scrivere codice IronRuby inline è necessario aggiungere il tag di script con le informazioni di tipo e la classe appropriate e il luogo codice IronRuby all'interno del tag nel modo seguente:

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

Per scrivere codice inline IronPython, semplicemente eseguire la stessa operazione con le sostituzioni appropriate:

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

Per scrivere il codice XAML inline, aggiungere il tag di script con le relative informazioni di tipo, ID, larghezza e altezza e inserire il codice XAML all'interno del tag:

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

È possibile accedere ai controlli XAML e implementare l'integrazione di eventi utilizzando codice, illustrerò durante lo sviluppo dell'applicazione nella sezione successiva. Una volta terminata con il codice, semplicemente esplorare la pagina e il risultato dell'applicazione dovrebbe essere visualizzato immediatamente.

Bing mappa Integration

Ora che si è visto la struttura di base dell'applicazione Silverlight linguaggio dinamico utilizzando il testo appena approccio di script inline, let’s portarla che esegue il mapping di un passaggio ulteriormente l'integrazione di Microsoft Bing (precedentemente noto come Virtual Earth).

SDK controllo Silverlight mappe di Bing Microsoft versione 1 è stato rilasciato nel novembre 2009 (MSDN.Microsoft.com/library/ee681884). Il programma di installazione è denominato BingMapsSilverlightControlv1.0.1Installer.msi. Si noti che è necessario disporre almeno 3 Silverlight da utilizzare con questo controllo. L'installazione include Microsoft.Maps.MapControl.dll e Microsoft.Maps.MapControl.xml, Microsoft.Maps.MapControl.Common.dll e Microsoft.Maps.MapControl.Common.xml e documentazione non in linea.

Prima di iniziare a creare applicazioni che utilizzano il controllo Silverlight Bing mapping, è necessario creare un account Bing mappe Developer per ricevere la chiave di autenticazione dell'applicazione. Per effettuare questa operazione, visitare bingmapsportal.com.

Il controllo Microsoft Bing mappe Silverlight versione CTP non era disponibile prima del rilascio della versione 1 del SDK. Esistono notevoli modifiche e miglioramenti nella versione 1 rispetto alla versione CTP. See MSDN.Microsoft.com/library/ee681889 per comprendere la chiave differenze tra la versione CTP e versioni 1.

A questo punto, creare un file SilverlightMap.html e includere il file dlr.js come descritto nella sezione precedente.

È necessario modificare il file AppManifest.xaml (disponibile nel file dlr.xap) e includere Microsoft.Maps.MapControl.dll e avviare Microsoft.Maps.MapControl.Common.dll file da caricare come parte dell'applicazione. Per effettuare questa operazione, rinominare dlr.xap dlr.xap.zip ed estrarre i file AppManifest.xaml e languages.config dal file. Aggiungere file Microsoft.Maps.MapControl.dll e Microsoft.Maps.MapControl.Common.dll come AssemblyPart, come illustrato in Nella figura 4.

Nella figura 4 File AppManifest.xaml modificato

<Deployment
  xmlns="https://schemas.microsoft.com/client/2007/deployment"
  xmlns:x="https://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>

Ora zip di AppManifest.xaml modificato, langugages.config esistente, i file Microsoft.Maps.MapControl.dll e Microsoft.Maps.MapControl.Common.dll e rinominare il file .zip dlr.xap. Sovrascrivere il file dlr.xap esistente, nella cartella dlr, sul server Web con uno nuovo.

Quindi, aprire il file SilverlightMap.html, aggiungere il tag di script per il codice XAML, quindi aggiungere il controllo UserControl con il nome Silverlight_map e un riferimento al controllo mappa per creare lo spazio dei nomi necessario (vedere Nella figura 5).

Nella figura 5 Riferimento ai controlli mappa nel file HTML

<Deployment 
  xmlns="https://schemas.microsoft.com/client/2007/deployment" 
  xmlns:x="https://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="https://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" Width="200" 
    Height="280" Background="Black" 
    xmlns:d="https://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    xmlns:m="clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl">
</UserControl>
</script>

Infine, aggiungere il controllo Canvas come elemento MAP sotto il controllo griglia e il contenitore principale. Si noti che è possibile mantenere la stessa larghezza e altezza dell'area e griglia controlla e impostata le proprietà larghezza e altezza del controllo mappa 800 e 400, rispettivamente:

<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>

Nei frammenti di codice illustrati di seguito, è necessario sostituire “ AuthenticationKey ” con la chiave di autenticazione per il controllo mappa.

Copiare il file nella cartella Sample/Getting.started esistente sul server Web e passare alla pagina. Verrà visualizzata la mappa con la modalità di strada predefinita (vedere Nella figura 6).

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

Nella figura 6 Applicazione basata su DLR Silverlight mappa di Bing in modalità di orientamento predefiniti

Modalità di mapping e animazioni 3D

Let’s modificare la modalità di mappa aerea con etichette come visualizzazione predefinita. Inoltre introdurre Let’s animazione 3D alla mappa.

Per modificare la modalità di mapping predefinito, innanzitutto assegnare l'elemento MAP un nome (in questo esempio, utilizzato map_in_ironruby) in modo che è possibile farvi riferimento nel codice basato su IronRuby inline. Proiezione 3D saranno applicabili anche ai oggetto map. Si trattava di una nuova funzionalità di Silverlight 3. Per eseguire questa operazione è possibile impostare la proprietà Projection dell'oggetto map a PlanProjection e viene impostata la proprietà RotationX su -20. Consente di trasformare l'oggetto map, fornendo un angolo di visualizzazione leggermente inclinate:

<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>

Si noti che è stato inoltre modificato lo sfondo della griglia in nero.

Aggiungere il tag script per IronRuby e scrivere le seguenti righe di codice per includere gli assembly necessari (inclusi MapControl.dlls) e attivare la visualizzazione con etichette per il controllo mappa aerea.

Si noti che con questo nuovo approccio testo appena è possibile riferimento oggetto map per nome. Nella versione corrente di Gestalt librerie, è necessario fare riferimento a oggetti con me o xaml forma abbreviata (qui utilizzato la mi abbreviata). In futuro, è possibile accedere agli elementi XAML con il set di x: Name tramite root_visual abbreviata:

<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>

Si noti che mantenuto il nome della classe del tag di script di IronRuby come sl_map, che è simile all'ID del tag di script di XAML.

Dopo l'esecuzione dell'applicazione, si noterà sfondo nero, inclinato angolo 3D e denominata Vista aerea, come illustrato in Nella figura 7.

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

Nella figura 7 Eseguire il mapping modalità set aerea con modalità etichette e proiezione 3D

Una dimostrazione comuni alla conferenza MIX09 era Silverlight e Bing Microsoft Map integrazione con rotazione di funzionalità per l'oggetto map. Implementare Let’s qualcosa di simile in IronRuby.

Per implementare questa funzionalità, è necessario definire la griglia con due colonne utilizzando ColumnDefinitions:

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

Successivamente, aggiungere tre pulsanti denominati mappa Ruota, Pause, arresta e Reimposta, insieme al testo del titolo nel file XAML all'interno del bordo. Tutto questo è nella prima colonna in Grid (vedere Nella figura 8).

Nella figura 8 Aggiunta di controlli dell'oggetto Grid

<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>

Aggiungere l'oggetto map alla seconda colonna della griglia:

<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>

Nel passaggio successivo, sarà necessario creare codice XAML aggiornamento piuttosto complesso. Si consiglia di creare il file XAML utilizzando un ambiente di sviluppo, ad esempio Expression Blend o Visual Studio per sfruttare le funzionalità Modifica e IntelliSense. Quindi è possibile copiare il codice XAML completato al file app.xaml del progetto.

Creare uno storyboard con map_animation il nome specificati per l'oggetto map denominato map_in_ironruby. (Tratto viene visualizzata in Nella figura 9. Vedere il codice di download per questo articolo per l'intero blocco di codice storyboard.). Lo storyboard definisce i fotogrammi chiave per le proprietà di animazione PlaneProjection RotationZ, RotationY, GlobalOffsetX e GlobalOffsetZ. Aggiungere lo StoryBoard come risorsa UserControl.

Nella figura 9 Creazione storyboard per animazioni

<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>

Il passaggio successivo consiste nell'aggiungere gli eventi Click per il codice IronRuby per avviare, sospendere, riprendere e arrestare l'animazione in linea. È innanzitutto necessario aggiungere un riferimento a System.Windows.Media e System.Windows.Media.Animation:

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

Disattivare il pulsante pause_resume durante il processo di inizializzazione dell'applicazione:

sm.pause_resume.is_enabled = false

A questo punto, implementare l'evento Click di ciascun pulsante. Iniziare con il pulsante rotate_map. Per utilizzare meglio lo spazio disponibile per l'animazione innanzitutto impostare oggetto map allineamento orizzontale a sinistra. Quindi impostare la proprietà RepeatBehavior dell'animazione dello StoryBoard di continuo e avviare l'animazione. Infine, attivare il pulsante pause_resume e impostare il contenuto del pulsante Pausa:

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

Implementare Click del pulsante pause_resume evento. In questo caso, a seconda se ci si trova in stato di sospensione o lo stato in esecuzione, si desidera riprendere o sospendere l'animazione di storyboard e modificare il contenuto del pulsante:

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

Infine implementare Click del pulsante stop_reset evento. Qui è possibile arrestare l'animazione di storyboard, disattivare il pulsante pause_resume e reimpostare il contenuto del pulsante Pausa. È inoltre possibile reimpostare l'allineamento dell'oggetto map:

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

Compilare ed eseguire il progetto utilizzando il comando /b Chiron per visualizzare la mappa con animazioni. Nella figura 10 viene illustrato il mapping di rotazione.

image: 3-D Map Animation

Nella figura 10 Animazione mappa 3D

Percorsi predefiniti di destinazione

Ora let’s evidenziare tre posizioni predefinite sulla carta: New York, San Francisco e Vancouver. Come illustrato in C# come parte della documentazione di Microsoft Bing mappa Control per CTP di Silverlight. Illustrerò come implementare questa funzionalità utilizzando IronRuby.

È necessario innanzitutto aggiornare il codice XAML inline per aggiungere tre pulsanti aggiuntivi in una nuova sezione sul lato sinistro dello schermo, uno per ogni ubicazione, New York, San Francisco e Vancouver. Questi vengono implementati molto come pulsanti precedenti. Una modifica significativa è l'aggiunta dell'attributo tag a ogni elemento Button. L'attributo Tag definisce le coordinate di posizione specifica e il livello di zoom della mappa.

Nel frammento di codice riportato di seguito viene illustrato il codice XAML per l'aggiunta di un pulsante per la posizione di New 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"/>

Questo attributo fornisce informazioni sulle coordinate per ogni ubicazione. Quando l'utente fa clic sul pulsante, queste informazioni viene utilizzate per la mappa della nuova destinazione. Vedere il codice di download per il codice di pulsanti di ricerca di percorso intero.

La maggior parte delle applicazioni dispone di un titolo e deve essere identica. Aggiunta del titolo “ Microsoft Bing mappe Silverlight e IronRuby integrazione del controllo ” nella seconda colonna della griglia, sostituendo l'elemento mapping esistente per posizionarlo sotto l'elemento StackPanel con il titolo del controllo TextBlock:

<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">
...

A questo punto il livello di presentazione è stato completato. Se si esegue l'applicazione a questo punto, dovrebbero essere altri tre pulsanti sotto la nuova sezione percorso di ricerca. La mappa, tuttavia, non verrà spostata nella posizione corrispondente se si fa clic su uno qualsiasi dei pulsanti appena aggiunti. Per cui è necessario implementare il codice sottostante per ciascun pulsante Click evento.

Gli eventi Click sono gli stessi per tutti e tre i pulsanti. In base al valore della proprietà tag del pulsante su cui è stato fatto clic corrispondente, passare tali coordinate e zoom livello come la specifica di visualizzazione per creare la nuova visualizzazione mappa. Qui ho utilizzato il metodo Split per suddividere le coordinate e il livello di zoom e impostare la visualizzazione mappa utilizzando il metodo SetView del controllo Maps. La nuova visualizzazione mappa verrà visualizzato il percorso definito:

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

È inoltre necessario aggiungere il riferimento Microsoft.Maps.MapControl.Design al programma per creare una nuova visualizzazione mappa.

include Microsoft::Maps::MapControl::Design

E che l'applicazione completata. Come si può vedere, sarebbe facile personalizzare le visualizzazioni, aggiungere altre destinazioni di ubicazione e implementare le funzionalità aggiuntive.

Guardare avanti

Prima di terminare l'articolo, vorrei presentare rapidamente l'externalizing inline codice (XAML e IronRuby/IronPython) approccio script.

Per modularizzare il modello di programmazione, copiare il file SilverlightMap.html finale e rinominarlo ExternalScript.html SilverlightMap. Quindi tagliare e incollare il codice XAML inline dal file ExternalScript.html SilverlightMap in un nuovo file di testo vuota e salvare come file SilverlightMap.xaml. Successivamente, tagliare e incollare il codice IronRuby dal file ExternalScript.html SilverlightMap nel nuovo file di testo vuota e salvare come file SilverlightMap.rb.

A questo punto, aggiornare i tag di script IronRuby e XAML del file ExternalScript.html SilverlightMap con l'attributo src definisce il percorso dei file XAML e IronRuby esterni:

<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>

Infine, copiare tre nuovi file, ovvero ExternalScript.html SilverlightMap, SilverlightMap.xaml e cartella del server Web Sample/Getting.started SilverlightMap.rb—to.A questo punto si visualizza il file ExternalScript.html SilverlightMap, si otterrà la stessa rotazione mappa con funzionalità di ricerca percorso.

Visitare il sito SilverlightStuff.net leggere il mio articolo sulla stessa applicazione creata utilizzando l'approccio tradizionale (utilizzando Chiron.exe).

Ashish Ghoda è Presidente di opinione Technology LLC e fondatore e associare director in una grande quattro accounting confermati. Visitare il suo siti technologyopinion.com and SilverlightStuff.neto contatto Ghoda direttamente al askashish@technologyopinion.com.

Grazie ai seguenti esperti tecnici per la revisione di questo articolo: Laurence Maroney e Jimmy Schementi