2011-09-26 32 views
5

Kısa bir süre önce WPF'de bazı şeyler yapmaya başladım ve haritaları uygulamalarıma entegre etme fikrini buldum. Google Haritalar'la bazı şeyler denedim, ancak yetenekler o kadar da iyi değil, bir süre sonra WPF'de Google Haritalar'dan vazgeçtim.Bilgi Kutusu

Bir süre sonra Bing Haritalar'a çarptı. Bu, WPF ile kullanmak için Google Haritalar'dan daha umut verici görünüyordu. Bing'in Haritaları ile oynamaya başladım ve yetenekleri harika! Bununla birlikte, haritaya bir raptiye koymaya çalıştığımda, bunun üzerine bastığınızda iğneye bir bilgi kutusunun nasıl ekleneceğini hemen anlayamadım. Bunun nasıl yapılacağına dair bazı örnekler buldum, ancak xaml ile bağlantılı prosedür kodu gerekiyordu. Aslında prosedür kodu kullanmadan bir yöntem arıyordum.

Yalnızca xaml ile bir raptiyeye bilgi kutusu eklemek mümkün mü? Veya bunun nasıl yapılacağı konusunda iyi bir alternatif yöntemi var mı?

Kullanılabilir bir araç ipucu özelliği var, ancak aslında bunu aramıyordum. Aslında Google Haritalar'ın raptiye türünü arıyordum (eğer mevcutsa).

cevap

8

Ne demek istediğinizi doğru anladığımı varsayalım, kısa cevabın: Üzgünüz, ancak sadece XAML ile bir raptiye bir Google-Maps tarzı bilgi kutusu eklemek mümkün değildir. Ancak, yapabiliyorsam yardım etmeye çalışacağım.

Yasal Uyarı: Silverlight için Bing Maps denetimi ile oynuyordum, bu nedenle bu, kontrolün WPF sürümüne de uygulanabilir.

Yerleşik Araç İpucu'nu kullanmak istemediğinizi sanıyorum çünkü bunun farklı görünmesini (örneğin metinle birlikte sadece sarı bir kutu) ya da kullanıcı taşındığında kaybolmasını istemediğinizi düşünün. fareyi uzağa

Sadece farklı görünmesini istiyorsanız, aşağıdakileri sunabilirim. Pushpins için bir şablon belirlediğimde, devam ettim ve yeniden ayarlanmış bir ToolTip kullandı ve daha fazla bilgi almak için kullanıcının raptiyeyi tıklamasına izin verdim. İşte

Bing Map with custom ToolTip

istediğiniz her şeyi içerebilir tabii bir StaticResource olarak tanımlanan araç ipucu şablon verilmiştir:

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

Ve burada kullandım nerede: Sonra

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

Kullanıcı bir ayrıntı alanına götürmek için raptiye tıkladığında ben idare ederdim.

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

Ancak, kullanıcı içine kontroller tıklayın, böylece kaybolan gelen araç ipucu tutmak istiyorum düşünün. Ne yazık ki, bunu yapmanın basit bir yolu olduğundan emin değilim. Kendi özel kontrolünüzü tanımlamanız gerekebilir, elbette bazı C#/VB kodlarını gerektirir.

Belki de bu yeni denetim Pushpin'den türetilebilir ve bilgi kutusu içeriğini mouse-over üzerinde ve/veya tıklatarak gösterebilir. Kodun çoğunu XAML'de tutmak için VisualStateManager'ı kullanabilirsiniz. C#/VB yalnızca içerik için bir bağımlılık özelliği sağlamak zorunda kalacak ve bazı durumlarda görsel durumlar arasında doğru zamanlarda geçiş yapmak için bazı geçersiz kılmalar olacaktır.

Umarım en azından biraz yardımcı olur!

+1

Bu çok açıklar, teşekkürler! Bu bilgi kutusunu sadece WPF'de yapmak için her türlü şeyi aramaya ve denemeye devam ettim .. Hahah bilgi için teşekkürler! Yöntemin, gitmenin en iyi yolu gibi görünüyorsun. Teşekkür ederim! :) – doc92