2011-09-26 20 views
5

Recientemente comencé a hacer algunas cosas en WPF y se me ocurrió una idea para integrar mapas en mi aplicación. Probé algunas cosas con Google Maps, pero las capacidades no son tan buenas, así que después de un tiempo renuncié a Google Maps en WPF.Infobox en WPF Bing Maps

Un poco después me encontré con Bing Maps. Esto parecía mucho más prometedor que Google Maps para usar con WPF. ¡Empecé a jugar con Bing's Maps y las capacidades son geniales!

Sin embargo, cuando traté de poner una chincheta en el mapa, no me quedó inmediatamente claro cómo agregar un cuadro de información al marcador cuando se movía sobre él. He encontrado algunos ejemplos de cómo hacerlo, pero se requiere un código de procedimiento vinculado a la xaml. En realidad estaba buscando un método sin usar código de procedimiento.

¿Es posible agregar un cuadro de información a un marcador con solo xaml? ¿O alguien tiene un buen método alternativo sobre cómo hacerlo?

Sin embargo, hay una propiedad de información sobre herramientas disponible, pero en realidad no estaba buscando eso. De hecho, estaba buscando el tipo de estilo de marcador de Google Maps (si está disponible).

Respuesta

8

Suponiendo que entiendo correctamente lo que quiere, creo que la respuesta corta es: Lo siento, pero no es posible agregar un cuadro de información al estilo de Google Maps en una chincheta con solo XAML. Sin embargo, intentaré ayudar si puedo.

Descargo de responsabilidad: He estado jugando con el control Bing Maps para Silverlight, así que espero que esto también se aplique a la versión WPF del control.

Imagino que no desea utilizar la información sobre herramientas integrada porque quiere que se vea diferente (es decir, no solo un cuadro amarillo con texto) o porque no quiere que desaparezca cuando el usuario mueve el alejar el mouse.

Si solo quiere que se vea diferente, puedo ofrecer lo siguiente. Cuando especifiqué una plantilla para mis marcadores, seguí usando una información sobre herramientas modificada y permití al usuario hacer clic en la chincheta para obtener más información.

Bing Map with custom ToolTip

Aquí está la plantilla de información sobre herramientas, que se define como un StaticResource, que por supuesto podría contener cualquier cosa que desee:

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

Y aquí es donde he usado:

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

Entonces Lo manejaría cuando el usuario hiciera clic en la chincheta para llevarlos a un área de detalles.

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

Sin embargo, imagino que desea mantener la información sobre herramientas de desaparecer, por lo que el usuario puede hacer clic en los controles en su interior. Desafortunadamente, no estoy seguro de que haya una manera simple de hacerlo. Es posible que deba definir su propio control personalizado, que por supuesto requeriría algún código C#/VB.

Quizás este nuevo control podría derivar de Pushpin, y podría mostrar el contenido del cuadro de información al pasar el mouse y/o hacer clic. Puede usar VisualStateManager para mantener la mayor parte del código en XAML. El C#/VB solo tendría que proporcionar una propiedad de dependencia para el contenido y algunas sustituciones para la transición entre los estados visuales en los momentos correctos.

¡Espero que al menos sea un poco útil!

+1

Eso explica mucho, ¡gracias! Seguí buscando e intentando todo tipo de cosas para hacer esa información en solo WPF .. ¡Jaja gracias por la información! Tu método parece ser el mejor camino a seguir. ¡Gracias! :) – doc92

Cuestiones relacionadas