2011-09-26 12 views
5

Ho recentemente iniziato a fare alcune cose in WPF e mi è venuta l'idea di integrare le mappe nella mia applicazione. Ho provato alcune cose con Google Maps, ma le funzionalità non sono eccezionali, quindi dopo un po 'ho rinunciato a Google Maps in WPF.Infobox in WPF Bing Maps

Poco dopo ho incontrato Bing Maps. Sembrava molto più promettente di Google Maps da utilizzare con WPF. Ho iniziato a giocare con le mappe di Bing e le funzionalità sono fantastiche!

Tuttavia, quando ho provato a mettere una puntina sulla mappa non mi è stato subito chiaro come aggiungere una infobox alla puntina da disegno, quando ci si passa sopra. Ho trovato alcuni esempi su come farlo, ma richiedeva codice procedurale collegato a xaml. In realtà stavo cercando un metodo senza usare codice procedurale.

È possibile aggiungere una infobox a una puntina con solo xaml? O qualcuno ha un buon metodo alternativo su come farlo?

Tuttavia, è disponibile una proprietà tooltip, ma in realtà non la stavo cercando. In realtà stavo cercando il tipo di stile pushpin di Google Maps (se disponibile).

risposta

8

Supponendo di aver capito correttamente cosa vuoi, credo che la risposta breve sia: scusa, ma non è possibile aggiungere una casella di informazioni in stile Google Maps a una puntina con solo XAML. Tuttavia, cercherò di aiutare se posso.

Disclaimer: Ho giocato con il controllo di Bing Maps per Silverlight, quindi spero che questo sia applicabile anche alla versione WPF del controllo.

Immagino che tu non voglia usare la ToolTip incorporata perché vuoi che appaia diversa (cioè non solo una casella gialla con testo) o perché vuoi che non scompaia quando l'utente sposta la il mouse via.

Se si desidera che sia diverso, posso offrire quanto segue. Quando ho specificato un modello per i miei simboli, sono andato avanti e ho utilizzato una ToolTip in templato e ho permesso all'utente di fare clic sulla puntina per ottenere maggiori informazioni.

Bing Map with custom ToolTip

Ecco il modello di descrizione comandi, definito come uno StaticResource, che ovviamente potrebbe contenere tutto quello che vuoi:

<Style x:Key="MyToolTipStyle" TargetType="ToolTip"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <Border CornerRadius="5" BorderBrush="Black" BorderThickness="2" Background="#5c87b2"> 
        <ContentPresenter Margin="5"> 
         <ContentPresenter.Content> 
          <StackPanel Margin="5" MaxWidth="400"> 
           <TextBlock Text="{Binding Name}" FontWeight="Bold" FontSize="16" Foreground="White" TextWrapping="Wrap"/> 
           <TextBlock Text="{Binding Description}" Foreground="White" TextWrapping="Wrap"/> 
          </StackPanel> 
         </ContentPresenter.Content> 
        </ContentPresenter> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

E qui è dove ho usato:

<maps:Map> 
    <maps:MapItemsControl ItemsSource="{Binding SearchResultsManager.Items}"> 
     <maps:MapItemsControl.ItemTemplate> 
      <DataTemplate> 
       <maps:Pushpin Location="{Binding Location}" Cursor="Hand" MouseLeftButtonUp="Pushpin_MouseLeftButtonUp"> 
        <ToolTipService.ToolTip> 
         <ToolTip Style="{StaticResource MyToolTipStyle}" /> 
        </ToolTipService.ToolTip> 
       </maps:Pushpin> 
      </DataTemplate> 
     </maps:MapItemsControl.ItemTemplate> 
    </maps:MapItemsControl> 
</maps:Map> 

Poi Gestirei quando l'utente ha fatto clic sulla puntina da disegno per portarli in un'area dettagli.

private void Pushpin_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    // Get a reference to the object that was clicked. 
    var clickedSearchResult = (sender as FrameworkElement).DataContext as SearchResultViewModel; 

    // Do something with it. 
} 

Tuttavia, immagino che si desidera mantenere la descrizione comandi dallo scomparire, in modo che l'utente può fare clic sui controlli al suo interno. Sfortunatamente, non sono sicuro che ci sia un modo semplice per farlo. Potrebbe essere necessario definire il proprio controllo personalizzato, che ovviamente richiederebbe un codice C#/VB.

Forse questo nuovo controllo potrebbe derivare da Spillo, e potrebbe mostrare il contenuto della casella di informazioni al passaggio del mouse e/o fare clic. È possibile utilizzare VisualStateManager per mantenere la maggior parte del codice in XAML. Il C#/VB dovrebbe solo fornire una proprietà di dipendenza per il contenuto e alcuni override per la transizione tra gli stati visivi ai tempi corretti.

Spero che sia almeno un po 'utile!

+1

Questo spiega molto, grazie! Ho continuato a cercare e provare tutti i tipi di cose per rendere questa infobox solo nel WPF .. Hahah grazie per le informazioni! Il metodo sembra il modo migliore per andare. Grazie! :) – doc92

Problemi correlati