2014-12-06 62 views
0

我試圖在通用應用程序中執行一個看似簡單的任務。 我希望能夠點擊我的地圖,並點擊觸發一個事件,這將給我的座標。我如何觸發點擊事件以獲取地圖中座標的通用應用程序

有很多指導說明如何做到這一點,但我需要一個解決方案,可以在我的通用應用程序(Windows 8.1/WindowsPhone)中工作。

MSDN博客Ricky Brundritt寫了關於這個主題的很棒的文章,我按照這個指南創建了一個可以在這兩個項目中使用的地圖。

http://blogs.msdn.com/b/rbrundritt/archive/2014/06/24/how-to-make-use-of-maps-in-universal-apps.aspx

如果我理解正確的話,他創建了一個獲取項目之間共享的條件語句的文件。而當你調用該項目運行正常implementatoin被使用的方法不同:

例:

public void SetView(BasicGeoposition center, double zoom) 
     { 
      #if WINDOWS_APP 
         _map.SetView(center.ToLocation(), zoom); 
         OnPropertyChanged("Center"); 
         OnPropertyChanged("Zoom"); 
      #elif WINDOWS_PHONE_APP 
         _map.Center = new Geopoint(center); 
         _map.ZoomLevel = zoom; 
      #endif 
     } 

現在,有落實,這將使我的座標,當我點擊的方法的方法在地圖上? 這裏是一個答案,一個類似的問題:(how to get the geolocation of a click on a bing map in C#

public MainPage() 
{ 
    this.InitializeComponent(); 

    this.MyMap.PointerPressedOverride += MyMap_PointerPressedOverride; 
} 

void MyMap_PointerPressedOverride(object sender, PointerRoutedEventArgs e) 
{ 
    Bing.Maps.Location l = new Bing.Maps.Location(); 
    this.MyMap.TryPixelToLocation(e.GetCurrentPoint(this.MyMap).Position, out l); 
    Bing.Maps.Pushpin pushpin = new Bing.Maps.Pushpin(); 
    pushpin.SetValue(Bing.Maps.MapLayer.PositionProperty, l); 
    this.MyMap.Children.Add(pushpin); 
} 

但怎麼一回事,因爲無法得到接取這不會對我的工作;

this.MyMap.PointerPressedOverride += MyMap_PointerPressedOverride; 

我只有:

this.MyMap.PointerPressed += MyMap_PointerPressedOverride; 

我也不要有接取TryPixelToLocation

this.MyMap.TryPixelToLocation(e.GetCurrentPoint(this.MyMap).Position, out l); 

所以總結起來,即時尋找一種方式,當我觸發一個事件點擊可以在兩個項目中工作的地圖。幫助讚賞。

謝謝!

編輯:

#elif WINDOWS_PHONE_APP 
private void _map_PointerPressed(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e) 
{ 
     Geopoint p; 
     _map.GetLocationFromOffset(e.GetCurrentPoint(_map).Position, out p); 
     MapClicked(p); 
} 
#endif 

我有一個奇怪的問題,得到這個在手機上運行。當我按下地圖時,該方法不會觸發。在設備上進行調試時,您可以在屏幕側看到som號碼。當我將數字推到數字所在的位置時,方法會觸發,並在數字後面添加一個。這真的很奇怪。不知怎的,「數字」是可點擊的,但地圖本身不是。

有沒有人有類似的問題?

回答

1

您可以在地圖視圖控件中創建一個事件處理程序,該處理程序返回用戶在地圖上單擊的座標。然後,您可以爲不同的地圖控件編寫所需的代碼,以處理單擊事件,獲取地圖座標並將其傳遞到事件處理程序。以下是MapView控件的修改構造函數和一些附加代碼,這些代碼添加了MapClicked事件和包裝地圖控件並將地圖座標傳遞到事件的代碼。

public MapView() 
{   
    #if WINDOWS_APP 
    _map = new Map(); 

    _shapeLayer = new MapShapeLayer(); 
    _map.ShapeLayers.Add(_shapeLayer); 

    _pinLayer = new MapLayer(); 
    _map.Children.Add(_pinLayer); 
    _map.PointerPressedOverride += _map_PointerPressedOverride; 
    #elif WINDOWS_PHONE_APP 
    _map = new MapControl(); 
    _map.PointerPressed += _map_PointerPressed; 
    #endif 

    this.Children.Add(_map); 

    SetMapBindings(); 
} 

public delegate void MapClickHandler(Geopoint center); 

/// <summary> 
/// A callback method used to when the map is Clicked 
/// </summary> 
public event MapClickHandler MapClicked; 

#if WINDOWS_APP 
private void _map_PointerPressedOverride(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e) 
{ 
     Location l; 
     _map.TryPixelToLocation(e.GetCurrentPoint(_map).Position, out l); 
     Geopoint p = new Geopoint(new BasicGeoposition() 
     { 
      Latitude = l.Latitude, 
      Longitude = l.Longitude 
     }); 
     MapClicked(p); 
} 
#elif WINDOWS_PHONE_APP 
private void _map_PointerPressed(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e) 
{ 
     Geopoint p; 
     _map.GetLocationFromOffset(e.GetCurrentPoint(_map).Position, out p); 
     MapClicked(p); 
} 
#endif 
+0

非常感謝您的幫助,也感謝您的博客和電子書。但有一個問題,當我點擊我的項目中的地圖 公共事件MapClickHandler MapClicked;總是空。當我刪除if語句,檢查是否爲空,我得到的座標。看起來你有一個名爲SetMapBindings的方法,我沒有這種方法,我無法在你的博客文章中找到它。也許這與我的問題有關? – user2915962 2014-12-08 12:47:34

+1

SetMapDingings方法可能來自不同的代碼示例。我有一個類似的通用應用程序項目已經打開,並用它來測試。當我有回調時,我習慣於使用Actions,你必須做一個空檢查。如果它沒有if語句,那麼刪除它們。 – rbrundritt 2014-12-08 13:10:54

+0

如果可以,請參閱編輯。 – user2915962 2014-12-17 15:03:02

相關問題